索引选择原则
explain分析语句与profile分析
联合索引结构与索引匹配原则
mysql对于索引优先考虑的对象
mysql索引的挑选原则
explain + query语句
explain SELECT id from products ORDER BY id LIMIT 10000000,1
主要看看select_type(查询类型)、type(索引类型)、key(索引),key_len(索引长度,组合索引中可以用到)、rows(找到数据前检索的行数),extra(额外信息)
profile使用方法:
//打开分析
set GLOBAL profiling=1;
执行查询语句:
SELECT id from products ORDER BY id LIMIT 10000000,1
查询所有profiles
show profiles;
查看 刚才查询语句的详细分析
show profile ALL for query 405;
//关闭分析
set global profiling=0;
联合索引结构与索引匹配原则
最左前缀匹配原则:在MySQL建立联合索引时会遵守最左前缀匹配原则,即最左优先,在检索数据时从联 合索引的最左边开始匹配。
mysql对于索引优先考虑的对象
-
条件与分组排序共存的情况下
当sql中where条件,分组,排序同时存在时,MySQL的优化器会优先选择条件来确定使用的索引,因为 where可以减少更多的sql扫描,而排序和分组往往进行的是全表扫描。 -
条件与排序共存
所有的排序都是在条件过滤之后才执行的,所以如果条件过滤了大部分数据的话,几百几千条数据进行排序其实并不是很消耗性能,即使索引优化了排序但实际提升性能很有限。 -
对于分组和排序共存的情况下
mysql会优先根据分组去选择索引,那是因为sql需要先将要查询的数据进行 分组,随后才会进行数据的排序。
mysql索引的挑选原则
字段一般是推荐重复比较少的字段影响到数据的检索,如果是项目需求(可建立联合索引)
唯一字段可以单独建立单索引,非唯一考虑联合索引,推荐尽量使用唯一字段建立索引
索引的个数,联合索引的个数 最佳 6个 以内,如果索引因为项目需求:最多 10个
索引的使用遵循最左匹配原则其次覆盖索引
尽量选择小的字段建立索引 int ,varchar(10), char(5)
避免<,<= ,> ,>= , % ,between 这样的条件。选择索引的字段的范围和模糊之前,因为范围与模糊 会引起索引失效,针对于联合索引,就是联合索引的中间尽量不要有范围查询的字段
尽量多使用explain分析
避免更新频繁的字段 (二叉树会一直变化,导致性能变慢)
建立的索引- 优先考虑 建立 联合索引
索引字段不要有 null, 不是 ‘’
1. 唯一字段可以建立单索引 where id = 4 非唯一字段可以考虑建立联合索引
2. 索引的个数与包含的字段,最佳是不超出6个,勉强可以是10个 =》 垂直分表
3. 索引的使用遵循最左匹配原则其次就是覆盖索引
4. 索引的选择字段尽量要小一些 int varchar(10) char(5) es 存储文本路径
5. 避免 like between 等范围查询
explain select name from staffs where name like "s%"; 可以使用到索引
explain select * from staffs where name like "%ars%";
explain select * from staffs where name like "%sky";
6. 尽量多使用explain进行分析
7. 优先考虑建立联合索引,索引的字段不要包含null 或者是 '';