1.独立的列:
索引不能使表达式的一部分,也不能是函数的参数。
在where条件中,应该始终将索引列放在比较符号的一侧。
2.前缀索引和索引的选择性:
有时候须要索引很长的字符列,会让索引大且慢。
除了使用在索引上创建哈希索引,还能够索引开始的部分字符。
对于BLOB,TEXT或很长的VARCHAR类型来讲,必须使用前缀索引,MySQL不容许索引这些列的完整长度。
3.多列索引:
常见错误:为每一个列建立独立索引,或者按照错误的顺序建立多列索引。
若是在EXPLAIN中看到有索引合并,应当好好检查查询和表的结构,也能够经过参数optimizer_switch来关闭索引合并功能,或者使用IFNORE INDEX提示优化器忽略某些索引。
4.选择合适的索引列顺序
一般把选择性最高的列放在前面是很好的。
可能须要根据运行频率来调整索引列的顺序。
5.聚簇索引
聚簇索引并非一种单独的索引类型,而是一种数据存储方式
一个表只能有一个聚簇索引,不是全部的存储引擎都支持聚簇索引
聚簇索引结构:叶子页包含了行的所有数据,节点页只包含索引列。
MySQL经过主键来汇集数据,没有定义主键,会选择一个惟一的非空索引代替,若是没有这样的索引,innodb会隐式定义一个主键做为聚簇索引
为何二级索引须要两次索引查找?
二级索引叶子节点中保存的不是指向行的物理位置的指针,而是行的主键值。这么作的好处是在innodb移动行时无需更新二级索引中的指针,坏处是占用了更多的空间。
OPTIMIZE TABLE指令:从新使用未使用的空间,整理文件碎片。
删除数据后,MySQL不会回收被删除数据占用的空间以及索引位,而是空在那里,等待新的数据填充。