bitscn.com
这几天在研究mysql数据库优化,在网上查了查资料,留在这里,后面继续跟新自己的研究心得。下面是网上的一些资料
在某些情况下,mysql可以直接使用索引来满足一个 order by 或 group by 子句而无需做额外的排序。
尽管 order by 不是和索引的顺序准确匹配,索引还是可以被用到,只要不用的索引部分和所有的额外的 order by 字段在 where 子句中都被包括了。
下列的几个查询都会使用索引来解决 order by 或 group by 部分:
select * from t1 order by key_part1,key_part2,... ;
select * from t1 where key_part1=constant order by key_part2;
select * from t1 where key_part1=constant group by key_part2;
select * from t1 order by key_part1 desc, key_part2 desc;
select * from t1 where key_part1=1 order by key_part1 desc, key_part2 desc;
在另一些情况下,mysql无法使用索引来满足 order by,尽管它会使用索引来找到记录来匹配 where 子句。这些情况如下:
1>对不同的索引键做 order by :
select * from t1 order by key1, key2;
2>在非连续的索引键部分上做 order by:
select * from t1 where key2=constant order by key_part2;
3>同时使用了 asc 和 desc:
select * from t1 order by key_part1 desc, key_part2 asc;
4>用于搜索记录的索引键和做 order by 的不是同一个:
select * from t1 where key2=constant order by key1;
5>表索引中的记录不是按序存储。例如,hash 和 heap 表就是这样。
通过执行 explain select ... order by,就知道mysql是否在查询中使用了索引。如果 extra 字段的值是 using filesort,则说明mysql无法使用索引。
查看索引
基数是数据列所包含的不同值的数量。例如,某个数据列包含值1、3、7、4、7、3,那么它的基数就是4。索引的基数相对于数据表行数较高(也就是说,列 中包含很多不同的值,重复的值很少)的时候,它的工作效果最好。如果某数据列含有很多不同的年龄,索引会很快地分辨数据行。如果某个数据列用于记录性别 (只有m和f两种值),那么索引的用处就不大。如果值出现的几率几乎相等,那么无论搜索哪个值都可能得到一半的数据行。在这些情况下,最好根本不 要使用索引,因为查询优化器发现某个值出现在表的数据行中的百分比很高的时候,它一般会忽略索引,进行全表扫描。惯用的百分比界线是30%。
bitscn.com