通过索引优化查询

来源:互联网 发布:宝宝喂奶记录软件 编辑:程序博客网 时间:2024/05/13 19:21

索引

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

[sql] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. mysql> alter table user add index (name,email);  
  2. Query OK, 5 rows affected (0.08 sec)  
  3. Records: 5 Duplicates: 0  Warnings: 0  

该查询条件没有使用到最左边的列,所以没有使用到索引。


该条件中使用了复合索引的最左边的列,因此该查询会使用到索引。

2、对于使用like的查询,查询如果是”%XXX”,不会使用到索引,‘XXX%’会使用到索引。

 

 

注意:在有些情况下,还是会用到like查询,比如通过歌词搜索歌名,通过剧情搜索电影名称。借助于工具,sphinx里面的coreseek软件。

3、如果条件中有or,则要求or的索引字段都必须有索引,否则不能用到索引。


该email添加索引后,在测试,会用到索引


4、如果列类型是字符串,一定要在条件中将数据使用引号引用起来,否则不使用索引。

 

5、优化group by语句

默认情况下, mysql对所有的group by col1,col2进行排序。这与在查询中指定order by col1,col2类型,如果查询中包括group by 但用户想要避免排序结果的消耗,则可以使用order by null禁止排序。

 

 



6、当取出的数据量超过表中数据的20%,优化器就不会使用索引,而是全表扫描。扫描的行数太多了,优化器认为全表扫描比索引来的块。


7、查看索引的使用情况


注意:

handler_read_key:这个值越高越好,越高表示使用索引查询到的次数。

handler_read_rnd_next:这个值越高,说明查询低效。

8、对应大批量插入数据

对于MyISAM

先禁用索引:

alter table table_name disable keys;

loading data//insert语句; 执行插入语句

执行完成插入语句后,开启索引,统一添加索引。

alter table table_name enable keys;

对于Innodb:

1,将要导入的数据按照主键排序

2,setunique_checks=0,关闭唯一性校验。

3,setautocommit=0,关闭自动提交。

0 0
原创粉丝点击