在MySQL中,对于索引的使用并是一直都采用正确的决定。
简单表的示例:
create TABLE `r2` (
ID` int(11) DEFAULT NULL,
ID1` int(11) DEFAULT NULL,
CNAME` varchar(32) DEFAULT NULL,
KEY `ID1` (`ID1`)
) ENGINE=MyISAM DEFAULT charSET=latin1
select count(*) FROM r2;
250001 (V1)
select count(*) FROM r2 where ID1=1;
83036 (V2)
(execution time = 110 ms)
(ID1=1)条件查询索引的选择性是 V2/V1 = 0.3321 或 33.21%
一般来说(例如书 “SQL Tuning“),如果选择性超过 20% 那么全表扫描比使用索引性能更优。
我知道Oracle一直是在选择性超过25%时会选择全表扫描。
而MySQL呢:
mysql> EXPLAIN select count(SUBNAME) FROM r2 where ID1=1;
+—-+————-+——-+——+—————+—–
| id | select_type | TABLE | type | possible_keys | KEY | key_len | ref | rows | Extra |
+—-+————-+——-+——+—————+—–
| 1 | SIMPLE | t2 | ref | ID1 | ID1 | 5 | const | 81371 | USING where |
+—-+————-+——-+——+—————+—–
这就是MySQL将会使用索引来完成这个查询。
让我们来对比索引查询和全表扫描的执行时间:
select count(SUBNAME) FROM t2 where ID1=1 – 410 ms
select count(SUBNAME) FROM t2 IGNORE INDEX (ID1) where ID1=1 – 200 ms
如你所看到全表扫描要快2倍。
参考更特殊的例子:选择性 ~95%:
select cnt2 / cnt1 FROM (select count(*) cnt1 FROM r2) d1, (select count(*) cnt2 FROM r2 where ID1=1) d2;
0.9492 = 94.92%;
说明MySQL将会用索引来完成查询。
执行时间:
select count(SUBNAME) FROM t2 where ID1=1 – 1200 ms
select count(SUBNAME) FROM t2 IGNORE INDEX (ID1) where ID1=1 – 260 ms
这次全表扫描要快4.6倍。
为什么MySQL选择索引访问查询?
MySQL没有计算索引的选择性,只是预测逻辑IO操作的数量,并且我们的例子中间的逻辑IO数量,索引访问要少于全表扫描。
最后我们得出结论,对于索引要小心使用,因为它们并不能帮助所有的查询。
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
2017年5月数据库流行度排行榜 MySQL与Oracle“势均力敌”
数据库知识网站DB-engines.com最近更新了2017年5月的数据库流行榜单。TechTarget继续与您一起分享最新的榜单情况。
-
2017年3月数据库流行度排行榜 Oracle卫冕之路困难重重
时隔一个月,数据库市场经过一轮“洗牌”,旧的市场格局是否会被打破,曾经占巨大市场份额的企业是否可能失去优势?
-
2017年2月数据库流行度排行榜 攻城容易守城难
2016年下半年,数据库排行榜的前二十名似乎都“固守阵地”,在排名上没有太大的变动。随着2017年的悄然而至,数据库的排名情况是否会有新的看点?
-
MySQL管理特性:让企业适合交易平台
当Alexander Culiniac和他的同事在TickTrade系统公司建立一个基于云的交易平台时,面临一些基本的约束。那就是,系统必须在云上工作良好并且经济实用。