1.
我们先看一个sql语句:
select * from it where userid =4
上面这个sql语句如果添加了userid作为索引,那么这条语句是会使用索引的.
再看下面这个:
select * from it where userid + 1 = 5
上面这个语句是不会使用userid索引的,不为什么,因为索引列不能参与计算,你可以写成where userid = 5-1,但不能写成where userid +1 =5
2.
对于it表,涉及的可能不是一个sql语句,这些sql语句可能有各种各样的查法,那么每个sql语句我都设计一个索引怎么样?
事实上,这对于查询来说是极好的。但是对于维护索引是极差的。你最好使用较少的索引高效的执行本表的sql语句。
比如:
针对it表,可能会有以下三个查询:
select * from it where userid = 1 ;
select * from it where style = 4 ;
select * from it where userid = 1 and style =4;
此时可以创建(userid)(style) (userid,style)这两条索引。
但明显是浪费了。(userid,style)比(userid)性能弱不了多少,且符合从左至右。
所以可以建立(style)(userid,style)两条索引。
但还可以更进一步,只创建(style,userid)这一条索引,但需要修改下sql语句:
select * from it where userid = 1 and style in (0,1,2,3,4);
select * from it where style = 4 ;
select * from it where userid = 1 and style =4;
style的值比较少,就这几个,而且In语句是可以使用索引的。
这样只需要一条索引就可以适用三条语句。
3.
select * from it where userid =4
如果使用了userid作为索引,它的效率依然不是最好的。
你可以尝试这条sql语句和覆盖索引结合在一起。
select * from it inner join (select id from it where userid=4) AS itid on it.id = itid.id
这里面使用了双语句双索引,select id from it where userid=4使用了覆盖索引取得了id(userid索引怎么取到的id?InnoDb存储的就是主键啊),然后id是主键索引来查表。