索引的设计可以遵循一定的原则,符合这些原则的索引,能够提高索引的使用效率。
1.搜索的索引列
要建索引的列不一定是所要结果的列,简单的说就是where条件中出现的列需要索引,或者链接子句用到的列需要索引,而只在select中出现的列不需要索引。
2.使用唯一索引
考虑某列中值的分布,索引列的基数越大越好,例如存放出生日期的列具有不同的值,很容易区分各行;而存放性别的列,只有两个值,所以对这种列加索引也没有什么价值,不管搜哪个值,都是大约一半的数据量。
3.使用短索引
如果对字符串列进行索引,应该指定一个前缀长度,只要有可能就应该这样做。例如,有一个char(200)的列,如果前10~20个字符内,多数值是唯一的,那么就不要对整个列进行索引(时刻考虑对资源的占用问题)。
4.利用最左前缀
在创建一个n列的索引时,实际是创建了mysql可利用的n个索引。多列索引可以起几个索引的作用,因为可以利用索引中最左边的列集来匹配行。这样的列集称为最左前缀。
5.不要过度索引
什么列都建索引是错误的,比如从来都不查询的列,建上索引后一次也不用没什么价值,反而占用了额外的资源。
对于小表,不需要索引,中到大表,用索引最好,特大表用分区。
同时,对于InnoDB存储引擎的表,记录默认按照一定的顺序保存,这个顺序是,如果有明确的主键,则按主键顺序存储,如果无主键有唯一索引,则按唯一索引顺序存储,如果也无唯一索引,则会自动生成一个内部列,按照这个列的顺序存储。主键要符合mysql数据类型的原则,即尽可能选择较短的数据类型。