表结构:sql:
SELECT vod_id FROM `ia_comment` where vod_id>0 and account_id=88;
SELECT vod_id FROM `ia_comment` where account_id=88;
结果:
[SQL]SELECT vod_id FROM `ia_comment` where vod_id>0 and account_id=88;
受影响的行: 0
时间: 0.323s[SQL]
SELECT vod_id FROM `ia_comment` where account_id=88;
受影响的行: 0
时间: 0.152s
为什么第二条sql扫描的rows多效率反而更高
两条sql得到的数据是一样的
vod_id 全部大于0
SELECT vod_id FROM `ia_comment` where vod_id>0 and account_id=88;
SELECT vod_id FROM `ia_comment` where account_id=88;
结果:
[SQL]SELECT vod_id FROM `ia_comment` where vod_id>0 and account_id=88;
受影响的行: 0
时间: 0.323s[SQL]
SELECT vod_id FROM `ia_comment` where account_id=88;
受影响的行: 0
时间: 0.152s
为什么第二条sql扫描的rows多效率反而更高
两条sql得到的数据是一样的
vod_id 全部大于0
解决方案 »
- mysql存储过程执行一半的奇怪问题
- MySql数据库的备份和恢复问题,大虾们帮忙。
- mysql 发生了死锁。。如何处理呢?错误提示看正文。谢大家
- mysql where in 语句很慢,求助
- SUN/MySQL 学习大会,机会难得
- Linux 下载 MySQL 服务器启动成功,可是登陆不成功,大侠帮忙!!
- 怎么让一字段能自动添加日期
- HELP!在线等~~~~~~~~~~~~~~~~~~
- 如何导入*.sql文件???-------------急100分!!!
- 请教个位大虾一个数据库的基础知识!!!!!!!!!!100分!!!!
- MySQL5.5版本后,对单个表的查询,存储过程相比即席查询,优势还有吗?
- mysql 返回字段类型转换问题
而第二条key_len是8,也就是说,where条件直接在索引上判断。
所以第二条会快一点。
第一条SQL是4,说明只用到了联合索引的第一个列vod_id,所以vod_id这个索引只用于vod_id>0的筛选,从索引读取数据之后,还要进行account_id=88的判断。
第二条SQL是8,说明用的是组合索引。rows:
当只用索引void_id时,vod_id>0 时,索引可能扫描25w+,当用组合做引时,可能扫描51W+,这个数据有时会是过期的不正确(有时需要table analysis下),用1列索引,2列索引时,有自己的策略,并不是说有50w 索引扫描就是50w,有可能是25W。时间:
第一条、根据索引扫描后,每条都需要再次判断是否=88。
第二条、根据索引可以直接定位到目标行。这个把重点搞偏了,vod_id全部>0, 不应这样写where条件。account_id 为具体值,不应该在组合索引后。
目前这个索引基本也是费的。