加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

索引的使用原则

(2016-06-07 17:26:11)

1)列独立 

只有参与条件表达式的字段独立在关系运算符的一侧,该字段才可能使用到索引。

独立的列是指索引列不能是表达式的一部分,也不能是函数的参数。

where id=4;

where id=4+1;

where id+1=3;

where 3+1=id;

2like查询 

mysql里,以%开头的like查询,用不到索引。

注意:如果select的字段正好就是索引,那么会用到索引即索引覆盖。

注意:在实际的开发中,这种需要是很多的,比如根据歌词查询歌曲的名称,比如根据电影的剧情,查询电影的名称,如果数据量非常大, 而且还用不到索引,如何解决,提高查询速度,通过后面学习的sphinx软件来解决。

3or运算都具有索引 

如果出现OR(或者)运算,要求所有参与运算字段都存在索引,才会用到索引。

4)复合索引使用 

对于创建的多列索引(复合)索引,只要查询条件中使用了最左边的列,索引一般就会使用。 

注意:索引覆盖的情况,如下所示,age虽然不是最左边的列,但是此处用到了索引,是因为用到了索引覆盖。

比如一个goods表  

cat_id(栏目的id)     shop_price价格,  

比如经常使用如下条件:cat_id=3 and shop_price>100

此处就可以把cat_idshop_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_idshop_price的联合索引

mysql> alter table goods add index   cat_price(cat_id,shop_price);

5mysql智能选择 

如果mysql认为,全表扫描不会慢于使用索引,则mysql会选择放弃索引,直接使用全表扫描。一般当取出的数据量超过表中数据的20%,优化器就不会使用索引,而是全表扫描。


 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有