|
本帖最后由 mchdba 于 2011-10-28 23:46 编辑
-- 【MySQL 覆盖索引】 参考网址 http://www.searchdatabase.com.cn/showcontent_53221.htm http://hi.baidu.com/shinegun/blog/item/e16f72b7184f36e530add189.html
原来自己也做过类似的优化处理,就是尽量做到索引的唯一性和rang性,但是却不知道这样的统称叫覆盖索引。今天被一个前辈问起覆盖索引,我竟然楞住了,没有反应过来!
覆盖索引就是select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖。
如果你想要通过索引覆盖select多列,那么需要给需要的列建立一个多列索引,当然如果带查询条件,where条件要求满足最左前缀原则。
如果explain之后,输出的Extra信息中如果有“Using Index”,就表示这条查询使用了覆盖索引,能使用覆盖索引的先决条件是不能select * from tb where xxxx;
再比如说在文章系统里分页显示的时候,一般的查询是这样的:
SELECT id, title, content FROM article ORDER BY created DESC LIMIT 10000, 10;
通常这样的查询会把索引建在created字段(其中id是主键),不过当LIMIT偏移很大时,查询效率仍然很低,改变一下查询:
SELECT id, title, content FROM article
INNER JOIN (
SELECT id FROM article ORDER BY created DESC LIMIT 10000, 10
) AS page USING(id)
此时,建立复合索引"created, id"【只要建立created索引就可以吧,Innodb是会在辅助索引里面存储主键值的】,就可以在子查询里利用上Covering Index,快速定位id,查询效率会提升很大。
|
|