关于mysql:更好的创建和使用Mysql索引

30次阅读

共计 938 个字符,预计需要花费 3 分钟才能阅读完成。

表构造

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

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

正文完
 0