创建高性能的索引
索引
索引也称为键(key) |
基本功能是用于快速找到记录,是一种数据结构 |
好的索引能够有效提高新能,但是差的索引会使性能急剧下降 |
索引的优点: 大大减少服务器需要扫描的数据量 帮助服务器避免排序和临时表 将随机IO变成顺序IO |
索引不一定是最好的解决方案 当表比较小的时候全表扫描更高效 当表相对大的时候,索引是一种比较好的选择 当表非常大的时候,索引的资源消耗也会变大,所以分区之类的技能可能更好 |
索引类型
mysql支持索引类型 | B-Tree索引(默认) B-Tree索引因为是顺序存储数据,所以可以用来进行分组排序 哈希索引(Memory) R-Tree空间数据索引 全文索引 其他 |
高性能的索引策略
独立的列 | 索引列不能作为表达式的一部分 where id - 1 = 2这种方式不会使用索引 where id = 3 这种方式才会使用索引 |
前缀索引 添加索引:alter table 表名 add key (字段(n)) 删除索引:alter table user drop index email; *前缀索引无法分组排序以及覆盖扫描 | 位数选择:下面两个值最接近的时候的n count(distinct 字段名) from 表名 count(distinct left(字段名,n)) from 表名 |
多列索引(复合索引) alter table 表名 add index (name,age); | 复合索引的第一个索引字段为主索引字段,查询想要使用复合索引的话必须包含第一个索引字段 |
选择合适的索引列顺序 | 把选择性大的索引放在前面(以次索引为条件对应查出来的数据更少) 如果匹配到的数据都很多,那么一般依赖经验进行设置 |
索引排序的注意点
order by 后面的字段需要是表的最左前列(按顺序) |
如果where提供了了一个满足最左前列的常量,order by可以使用紧接的字段 |
不要同时使用两个方向的排序 |
不要使用范围查询 |
mysql如果对一个索引进行了范围检索,就无法再使用另一个索引或者该索引的后续字段进行排序 |