最左前缀原理
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索引背后的数据结构及算法原理