您的位置:首页 > 数据库 > MySQL

mysql索引注意事项

2015-12-11 15:25 232 查看

一、复合索引的建立以及最左前缀原则

在查询条件中必须有复合索引还中最左侧的列(在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边)

假设你在表的state、city和zip数据列上建立了复合索引。索引中的数据行按照state/city/zip次序排列,

因此它们也会自动地按照state/city和state次序排列。这意味着,即使你在查询中只指定了state值,

或者指定state和city值,MySQL也可以使用这个索引。因此,这个索引可以被用于搜索如下所示的数据列组合:

相当于创建以下三个索引:

state, city, zip (顺序可以变)

state, city

state

MySQL不能利用这个索引来搜索没有包含在最左前缀的内容。例如,如果你按照city或zip来搜索,

就不会使用到这个索引。

如果你搜索给定的state和具体的ZIP代码(索引的1和3列),

该索引也是不能用于这种组合值的,尽管MySQL可以利用索引来查找匹配的state从而缩小搜索的范围。

(用explain中看到的Extra列=Using index condition, 而出现前两个列的Extra列=Using index condition)

如果你考虑给已经索引过的表添加索引,那么就要考虑你将增加的索引是否是已有的多列索引的最左前缀。

如果是这样的,不用增加索引,因为已经有了(例如,如果你在state、city和zip上建立了索引,那么没有必要再增加state的索引)。

实例分析

通过实例理解单列索引、多列索引以及最左前缀原则

实例:现在我们想查出满足以下条件的用户id:

mysql>SELECT `uid` FROM people WHERE lname`='Liu'  AND `fname`='Zhiqun' AND `age`=26

因为我们不想扫描整表,故考虑用索引。

单列索引:

ALTER TABLE people ADD INDEX lname (lname);

将lname列建索引,这样就把范围限制在lname='Liu'的结果集1上,之后扫描结果集1,产生满足fname='Zhiqun'的结果集2,再扫描结果集2,找到 age=26的结果集3,即最终结果。

由于建立了lname列的索引,与执行表的完全扫描相比,效率提高了很多,但我们要求扫描的记录数量仍旧远远超过了实际所需 要的。虽然我们可以删除lname列上的索引,再创建fname或者age 列的索引,但是,不论在哪个列上创建索引搜索效率仍旧相似。

多列索引:

ALTER TABLE people ADD INDEX lname_fname_age (lame,fname,age);

为了提高搜索效率,我们需要考虑运用多列索引,由于索引文件以B-Tree格式保存,所以我们不用扫描任何记录,即可得到最终结果。

注:在mysql中执行查询时,只能使用一个索引,如果我们在lname,fname,age上分别建索引,执行查询时,只能使用一个索引,mysql会选择一个最严格(获得结果集记录数最少)的索引。

二、不建议建立索引

唯一性太差的字段不宜建立索引:如(性别等。)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: