码迷,mamicode.com
首页 > 数据库 > 详细

mysql索引整理

时间:2017-05-28 22:30:56      阅读:253      评论:0      收藏:0      [点我收藏+]

标签:表示   存储   varchar   没有   cat   extra   ext   range   范围查询   

一.索引:

1.创建一般索引 create index index_name on table_name(columnname[...]); 

2.分析sql执行语句 在select 之前加explain eg:explain select * from table_name;

3.mysql从5.5.5之后默认采用innerdb为默认的存储引擎,该引擎支持的两种常见索引:b+树索引和hash索引,hash索引的效率高于b+树,但hash索引只支持=类型。

b+树可以支持范围的eg:>< ,b+树一般三层即可表示,即访问3次io可找到数值。

二.常见丢失索引的情况

1.左前缀法则:建立的联合索引,如果查询条件没有第一个带索引的列,则会丢失索引效果。

2.在索引的列表上有函数eg:max() left() avg(),则会丢失索引

3.使用<>或!=会无法使用索引 遇到不等于的情况,建议改用范围查询大于 or 小于

4.建议少用or

5.is null && is not null 会引起全表扫描

6.varchar类型字段加‘‘ 否则会出现2的场景,因为mysql会隐式转化,先将数字转成varchar

数据库中定义为日期类型的字段,查询时程序中用str_to_date转成日期在查询,否则mysql也会进行隐式转化

7.like ‘%_%‘ && like ‘%_‘ 会引起全表扫描,将%放在右边eg: like ‘_%‘能引用到索引,索引类型type=range

实际情况下如果左右两边都要加百分号,我们可以用覆盖索引来解决,eg: select name from table where name like ‘%name%‘; create index index_name on table(name,age);

要求所查询的字段必须被索引所覆盖到,在explain的时候,输出的extra信息中如果有“Using Index”,就表示这条查询使用了覆盖索引,这就是覆盖索引。

在mybatis持久层框架中我们可以用concat拼接的方式处理。

8.减少select * 的使用

 

mysql索引整理

标签:表示   存储   varchar   没有   cat   extra   ext   range   范围查询   

原文地址:http://www.cnblogs.com/sunys/p/6916750.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!