1 | [ UNIQUE | FULLTEXT | SPATIAL ] [ INDEX | KEY ] |
单列索引 即一个索引只包含单个列。 KEY [ index_name ] (col_name)
组合/复合 索引 即一个索引包含多个列。INDEX index_name (col_name1,col_name2)
普通索引
主键
primary key
唯一索引
unique INDEX index_name (col_name1,col_name2)
空间索引 (仅 MyISAM 引擎支持)
全文索引
fulltext KEY
(仅 MyISAM 引擎支持) (只能创建在 CHAR、VARCHAR 或 TEXT 类型的字段上)
MySQL 只对以下操作符才使用索引:<
<=
=
>
>=
between
in
以及某些时候的 like
(不以通配符 % 或 _ 开头的情形,%a
不可以,a%
可以)
索引不会包含有 null 值的列
不要在列上进行运算
1 | SELECT * FROM table_name WHERE YEAR(column_name)<2017; |
原则
最左前缀
可以考虑使用索引的主要有两种类型的列:在 where 子句中出现的列,在 join 子句中出现的列
考虑列中值的分布,索引的列的基数越大,索引的效果越好
使用短索引,如果对字符串列进行索引,应该指定一个前缀长度,可节省大量索引空间,提升查询速度
不要过度索引
1 | SHOW INDEX FROM tbl_name; |
explain
1 | mysql> explain select * from servers; |