看下下面这条语句的explain plan (user_name已被索引)
select user_name from user where user_name = 'chenjianjx'
你会发现 Extra这一列中写的是:Using Index
它的意思执行查询时用到了Covering Index.
Covering Index的意思是指索引中直接包含了一个查询所需返回的数据。按user_name只查user_name, 所有数据都可以从user_name的索引中给出。
很明显,这对性能有帮助,因为你不需要再费几次I/O去取数据; 同时由于索引本身排好了序,体积小更容易直接存储在内存中,所以只查索引,性能上的好处是很大的。
如果查整行,
select * from user where user_name = 'chenjianjx'
Extra中就不再有"Using Index"了,因为你的索引中本身没有存储整行。
如果你的存储引擎是Innodb, 这样查呢?
select id, user_name from user where user_name = 'chenjianjx' -- id是主键
Extra中又会有"Using Index", 这是因为在innodb中,所有secondary index中的结点中都包含了相应数据对应的主键的值。
以上结论的作用是:不要总是傻傻地返回整行( select *) . 如果你直需要索引中的数据,或者索引中的数据加上主键(只对innodb有效),那就让你的sql只返回索引字段吧(以及主键)。