第8章-9 优化技巧2
上一篇:《第8章-8 优化技巧1》,接着继续了解优化技巧,更多是把之前的知识,做一个详细的介绍。
1.索引的选择性
对索引选择性进一步了解。索引选择性是指不重复的索引值与表总记录数的比值,其范围(0,1]。通过索引的选择性,可以确定该索引是否合理(70%)。
SELECT * FROM employeesWHERE first_name='Martial' AND last_name='DuCasse';
1.单列的选择性:
select count(distinct first_name)/count(*) from employees; -- 0.45%select count(distinct last_name)/count(*) from employees; -- 0.58%
2.组合列的选择性:
select count(distinct(concat(first_name,last_name)))/count(*)
from employees --99.32% --30
3.创建组合索引:
-- 列的顺序:选择性高的列作为前导列
create index idx_name01 on employees(last_name,first_name);
对索引列的两个基本要求
1,索引选择性越高越好
2,索引长度越短越好
2,前缀索引
前缀索引:指用列的前缀代替整个列作为索引,当前缀长度合适时,可以使前缀索引的选择性接近全列索引,同时因为索引变短而减少索引的叶子节点。
select count(distinct(concat(last_name,left(first_name,2))))/count(*)
from employees; -- 89% select count(distinct(concat(last_name,left(first_name,4))))/count(*)
from employees; -- 93% select count(distinct(concat(last_name,left(first_name,6))))/count(*)
from employees; -- 91%
根据不同的前缀长度,考虑用二分法进行测量,再确定合适的长度
create index idx_name02 on employees(last_name,first_name(4));
3,索引覆盖:
索引覆盖:一个索引包含了所有需要查询的字段,则称为‘索引覆盖’。即只需扫描索引而无须回表。
create index idx_name on employees(last_name,first_name);
gender 不在索引idx_name 所以不能走索引覆盖,需要回表进行二次查询
explain SELECT gender FROM employees
WHERE first_name='Martial' AND last_name='DuCasse';
索引包含了所有需要查询的字段 所以走“索引覆盖” 无需回表
explain SELECT first_name,last_name
FROM employees
WHERE first_name='Martial' AND last_name='DuCasse';
二级索引的叶子结点由 索引列+主键值组成 ,所以走“索引覆盖” 无需回表
explain SELECT first_name,last_name,emp_no
FROM employees
WHERE first_name='Martial' AND last_name='DuCasse';
索引覆盖特点:
1,无需回表,减少IO
2,在EXPLAIN的Extra列可以看到“Using index”的信息
总结:
后续有碰到其它的优化技巧,再进行追加。索引选择性是索引有效性的评估手段,注意前缀索引的使用,减少索引的叶子节点,提高效率
上一篇:《第8章-8 优化技巧1》
下一篇: