- 能用整型不用字符型。整型处理起来比字符更快。
- 尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL。只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
- 尽量使用短索引。在较长的char/varchar字段上创建索引时,最好为索引指定前缀长度。
create index indexName on tableName(charField(10))
- 尽量不在text/blob类型上创建索引。即使要在text/blob上建索引,也一定要指定前缀长度。
create index indexName on tableName(textField(30))
- 尽量不使用like查找,如果要使用尽量只在右边使用%,如果使用like”%keyword%”或者使用like “%keyword”,会导致索引失效。
- 不要在索引列上使用MYSQL函数,这会导致索引失效。比如不要这样:select * from users where YEAR(adddate)<2007
- 不要在唯一性不强(有大量重复值)的字段上加索引,比如性别字段。
- 根据业务需求,在经常使用where/join的字段上添加加索引。
- 索引不是越多越好,在insert/update时,可能会重建索引,影响写入效率。
- 创建联合索引时,要紧密结合实际业务使用需求,注意最左原则的使用。
- 能使用联合索引就不要使用单列索引。
比如:create index `indexName` on tableName (i1,i2,i3)。
如果不用这个联合索引,而是使用单列索引,那么在执行以下SQL时,
select * from `tableName` where i1=X and i2=Y and i3=Z时,MYSQL只会选择他认为最有效率的单列索引。而使用联合索引的话,会直接定位到符合条件记录。
- MySQL只对以下操作符才使用索引:<,<=,=,>,>=,between,in,以及某些时候的like(不以通配符%或_开头的情形)。对于NOT IN和<>操作符,是不会使用索引的。