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