高性能Mysql---------------高性能索引

索引优化是对性能优化最有效的手段。索引能轻易将查询性能提高几个数量级。

mysql中存储引擎先在索引中找到对应值,然后根据匹配的索引记录找到对应的数据行。
例如:
select name from user where id = 5;
id上有索引,Mysql使用索引找到id为5的行,然后返回数据。
索引对多个值进行排序的依据是create table 语句中定义索引时列的顺序。

最常见的B-Tree索引,按照顺序存储数据。索引有以下三个优点:
1)索引大大减少了服务器需要扫描的数据量;
2)索引帮助服务器避免排序和临时表;
3)索引可以将随机I/O变成顺序I/O

高性能索引策略:

1)独立的列:索引列不能是表达式的一部分,也不能是函数的参数;
2)前缀索引:一个列, 字符很长,又必须加索引,需要选择足够长的前缀保证较高的选择性,同时又不能太长;
创建前缀索引: alter table user add key(name(7));
无法用前缀索引做order by和 group by,也无法用前缀索引做覆盖扫描
3)多列索引
子句中的排序、分组和范围条件等其他因素,可能对查询的性能造成非常大的影响。
4)覆盖索引
一个索引包含了所有需要查询的字段的值,我们就称之为覆盖索引
发起一个被索引覆盖的查询时,在explain的extra的列可以看到"using index"的信息。
多列索引(name, age),如果只访问这两列,就可以用这个索引做覆盖索引
select name, age from user

如果索引不能覆盖查询所有的列,就得每扫描一条索引记录就回表查询一次对应的行。

选择索引和使用索引时,有如下三个原则需要记住:
1.单行访问是很慢的;
2.按顺序访问范围数据是很快的;
3.索引覆盖查询时很快的

遇到order by排序,而查询数据并不是有序的,可以进行如下优化:
1)修改逻辑,不在mysql中使用order by而是在应用中自己进行排序
2)使用mysql索引,将待排序的内容放到索引中,直接利用索引的排序

mysql多表关联left join其他表的时候,如果以其他表的字段作为查询条件都会产生临时表,解决思路:将非直接关联转成直接关联

猜你喜欢

转载自blog.csdn.net/zhanglinlove/article/details/83513782