Mysql-索引的优化

索引的优化

回表:在innodb从其他字段索引查到主键,在回主索引那张表上面去找到记录的内容

索引覆盖:不需要回表的索引查找就叫做索引覆盖

最左匹配:只要查询条件的列中包含组合索引最左边的那一列,不管该列在查询条件中的位置,都会使用索引进行查询

索引下推:
例子:(name,age)
1.先根据name列从存储引擎中把符合规则的数据拉去到mysql的server层
2.在server层按照age进行数据过滤

1.直接从存储引擎拉取数据的时候直接按照name和age做判断,将符合的结果返回给mysql server
这里的第二种就是索引下推(IO量不同)

谓词下推:
例子:select t1.name,t2.name from t1 join t2 on t1.id=t2.id;
1.把所有的字段先做表关联,然后再从关联好的表中选择需要的4个字段
2.先把两张表需要的4个字段取出,然后在做表关联
谓词下推就是第二种

聚簇索引:不是单独的索引类型,而是一种数据存储方式,数据和索引是一体的
非聚簇索引:索引跟数据分开来存的 MYD是数据文件 MYI是索引文件

优化细节
1.当使用索引列进行查询的时候尽量不要使用表达式,把计算放到业务层而不是数据层
2.尽量使用主键查询 因为不用回表(IO问题)
3.使用前缀索引 例子left(city,7)
4.使用索引扫描来排序
5.范围列可以用列索引 范围条件是<、<= > >= between
范围列可以用到索引你,但是范围列后面的列无法用到索引,索引最多用于一个范围列
6.强制类型转换会触发全表扫描
例子:explain select * from user where phone=1234;不会用到索引
explain select * from user where phone=‘1234’;用到索引
7.更新频繁的,数据区分度不高的字段不宜建立索引
8.创建索引列,不允许为null,可能会得到不符合语气的结果
9.能用limit就用limit
10.组合索引尽量不要超过5个

索引不会使用的几种情况
1.索引参加表达式计算 例子 where ‘age’+10=30;
2.函数运算
3.模糊查询 %语句% 但是语句%走索引
4.字符串和数字比较不走索引
5.有or语句
6.正则表达式不走索引
7.mysql内部优化 觉得全盘扫描比使用索引快 就走全盘扫描

猜你喜欢

转载自blog.csdn.net/lirenci123/article/details/109539645