第8章-9 优化技巧2

        上一篇:《第8章-8 优化技巧1》,接着继续了解优化技巧,更多是把之前的知识,做一个详细的介绍。

1.索引的选择性

对索引选择性进一步了解。索引选择性是指不重复的索引值与表总记录数的比值,其范围(0,1]。通过索引的选择性,可以确定该索引是否合理(70%)。

SELECT * FROM employees

WHERE 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》

        下一篇:《第8章-10 慢日志查询》

你可能感兴趣的:(mysql高级,mysql,索引选择性)