mysql优化学习记录1--索引和order by

在看高性能  mysql 时,里面有些总结写得很好,因此就记录下来,方便本身查询。若是发现有写得不对的,欢迎指出。mysql

数据表创建索引了,但若是查询方式不对,则不能正确使用索引的快速查询。sql

CREATE TABLE people(
last_name VARCHAR(50) NOT NULL,
first_name VARCHAR(50) NOT NULL,
dob DATE NOT NULL,
gender ENUM('m','f') NOT NULL,
KEY(last_name,first_name,dob)
)
服务器

1 . 单张表查询时,索引列的顺序应该和 order by 的顺序同样,而且全部列都应该是升序或是降序。这时查询出来的结果是使用了索引而且对索引进行了排序。性能

2. 多表查询时, order by 所引用的全部字段应该都是第一张表里面的字段优化

B-Tree索引的限制:spa

1 若是不是按照索引的最左列开始查找,则没法使用索引。例如上面例子中的索引在每用于查找名字为Bill的人,也无怯查找某个特定生日的人,由于这两列都不是最左数据列。相似地,也无战查找姓氏以某个字母结尾的人。当把几个列合并为一个索引时,要使用索引,则必定要使用该索引中的第一列,好比上面的people表,其实只有一个索引 (last_name) ,要用到这个索引,则 where 条件中必定要使用到  last_name排序

 

2 不能跳过索引中的列。也就是说,前面所述的索引没法用于查找姓为Smith而且在某个特定日期出生的人。若是不指定名(first_name),则MySQL只能使用索引的第一列。索引

3 若是查询中有某个列的范围(like  between > < 都算范围查询)查询,则其右边全部列都没法使用索引优化查找。例若有查询 WHERE lastname='Smith’AND firstname like '%J%'AND dob=’1976-12-23',这个查询只能使用索引的前两列,由于这里的like是一个范围条件(可是服务器能够把其他列用于其余目的)。若是范围查询列值的数量有限,那么能够经过使用多个等于条件来代替范围条件。查询时,把条件属于范围的,放在最后面,由于它的右边就不能使用索引了it

以上面那三个点,具体可看此 http://www.programgo.com/article/2117140041/ast

相关文章
相关标签/搜索