索引的使用原则
(2016-06-07 17:26:11)(1)列独立
只有参与条件表达式的字段独立在关系运算符的一侧,该字段才可能使用到索引。
“独立的列”是指索引列不能是表达式的一部分,也不能是函数的参数。
where id=4;
where id=4+1;
where id+1=3;
where 3+1=id;
(2)like查询
在mysql里,以%开头的like查询,用不到索引。
注意:如果select的字段正好就是索引,那么会用到索引即索引覆盖。
注意:在实际的开发中,这种需要是很多的,比如根据歌词查询歌曲的名称,比如根据电影的剧情,查询电影的名称,如果数据量非常大, 而且还用不到索引,如何解决,提高查询速度,通过后面学习的sphinx软件来解决。
(3)or运算都具有索引
如果出现OR(或者)运算,要求所有参与运算字段都存在索引,才会用到索引。
(4)复合索引使用
对于创建的多列索引(复合)索引,只要查询条件中使用了最左边的列,索引一般就会使用。
注意:索引覆盖的情况,如下所示,age虽然不是最左边的列,但是此处用到了索引,是因为用到了索引覆盖。
比如一个goods表
cat_id(栏目的id)
比如经常使用如下条件:cat_id=3 and shop_price>100
此处就可以把cat_id和shop_price建立一个联合索引,如果你要单独建立索引,最终只能使用到一个,这样效率低,
mysql> create table goods(cat_id int,shop_price int);
mysql> alter table goods add index (cat_id),add index (shop_price);
mysql> insert into goods values(3,23),(4,24),(3,19),(3,102),(3,115);
mysql> alter table goods drop index cat_id,drop index shop_price;
#建立cat_id和shop_price的联合索引
mysql> alter table goods add index
(5)mysql智能选择
如果mysql认为,全表扫描不会慢于使用索引,则mysql会选择放弃索引,直接使用全表扫描。一般当取出的数据量超过表中数据的20%,优化器就不会使用索引,而是全表扫描。