最左前缀原理

SHOW INDEX FROM student;

EXPLAIN SELECT * FROM student 
WHERE emp_no='10001' AND title='Senior Engineer' AND from_date='1986-06-26';

收集执行语句所使用的资源

默认的是关闭的

SET profiling = 1;
show PROFILES\G

show warnings;

索引选择性

不重复的索引值(也叫基数,Cardinality)与表记录数(#T)的比值

$$ Index Selectivity = Cardinality / #T $$

显然选择性的取值范围为(0, 1],选择性越高的索引价值越大

示例:

SELECT count(DISTINCT(name))/count(*) AS Selectivity FROM student

SELECT count(DISTINCT(concat(name, age)))/count(*) AS Selectivity FROM student

前缀索引

SELECT count(DISTINCT(concat(first_name, left(last_name, 3))))/count(*) AS Selectivity
FROM student

ALTER TABLE employees.employees
ADD INDEX first_name_last_name4 (first_name, last_name(4))

建议

在使用InnoDB存储引擎时,如果没有特别的需要,请永远使用一个与业务无关的自增字段作为主键

参考
1. MySQL索引背后的数据结构及算法原理