表构造

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就能够将更多的记录加载到内存中),读写效率也就越高。

这个倡议对于表的主键来说更加实用,因为不仅聚簇索引会存储主键值,其余所有的二级索引的节点都会存储一份记录的主键值。如果主键应用更小的数据类型,也就意味着能节俭更多的存储空间。