表构造
CREATE TABLE single_table( id int not null auto_increment, key1 VARCHAR(100), key2 int, key3 VARCHAR(100), key_part1 VARCHAR(100), key_part2 VARCHAR(100), key_part3 VARCHAR(100), common_field VARCHAR(100), PRIMARY KEY(id), key idx_key1(key1), unique key uk_key2(key2), key idx_key3(key3), key idx_key_part(key_part1,key_part2,key_part3))engine=INNODB charset=utf8mb4
只为用于搜寻、排序或分组的列创立索引
咱们只为呈现在where子句中的列、连接子句中的连贯列,或者呈现在ORDER BY或者GROUP BY子句中的列创立索引。仅呈现在查问列表中的列就没必要建设索引。比方这样一个查问语句:
SELECT common_field,key_part3 FROM single_table WHERE key1 = 'a';
查问列表中的common_field、key_part3这两个列就没必要创立索引。咱们只须要为呈现在WHERE字句中的key1列创立索引就能够了。
思考索引列中不反复值的个数
在通过二级索引进+回表的形式执行查问时,某个扫描区间中蕴含的二级索引记录数量越多,就会导致回表操作的代价越大。咱们在为某个列创立索引时,须要思考列中不反复值的个数占全副记录条数的比例。如果比例太低,则阐明该列蕴含过多的反复值,那么在通过二级索引+回表的形式执行查问时,就有可能执行太屡次回表操作。
索引的类型尽量小
能应用INT就不要应用BIGINT。因为数据类型越小,索引占用的存储空间就越少,在一个数据页就能够寄存更多的记录,磁盘I/O带来的性能损耗也就越小(一次页面I/O就能够将更多的记录加载到内存中),读写效率也就越高。
这个倡议对于表的主键来说更加实用,因为不仅聚簇索引会存储主键值,其余所有的二级索引的节点都会存储一份记录的主键值。如果主键应用更小的数据类型,也就意味着能节俭更多的存储空间。