表构造
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 就能够将更多的记录加载到内存中),读写效率也就越高。
这个倡议对于表的主键来说更加实用,因为不仅聚簇索引会存储主键值,其余所有的二级索引的节点都会存储一份记录的主键值。如果主键应用更小的数据类型,也就意味着能节俭更多的存储空间。