再看索引

2020-10-04  本文已影响0人  知名乐天

说在之前

在此之前,我想描述下我的一个疑惑,假设现在有一个这样的表,里面记录的相应人员的 性别[sex],年龄[age],和名字[name],现在给这些字段建索引的话,众所周知,可以这样建sex,age,name,当在进行查询的时候,有可能并不限制性别,在这种情况下,如果是为了命中索引,可能会在原来的索引上添加 sex in (male, female),这样的话,是否还需要继续建立一个新的索引呢? 这个是我的一个疑惑。

前情提要

在平时mysql的使用过程中,在接触中必不可少的便是关于索引的点点滴滴了。甚至于在进行查询优化的过程中,索引优化也同时扮演着十分重要的角色。深入了解mysql的前提,就是走进索引,了解索引,使用索引。

索引类型

索引类型中比较常见的有 BTree索引 和哈希索引(相对于btree更少,但是在一些合适的场景下,它带来的性能提升是巨大的)

通过举例子的方式来看数据是否用到了索引吧:
假设目前有一个表:

create table rental {
    XXXXX
    PRIMARY KEY (rental_id),
    UNIQUE KEY rental_date (rental_date, inventory_id, customer_id)
    KEY idx_fk_inventory_id (inventory_id),
    KEY idx_fk_customer_id (customer_id),
    KEY idx_fk_staff_id (staff_id)
    
}

从上面的表中我们可以看到,总共对三个字段进行了索引的创建以及创建了一个唯一的索引(注意索引的顺序).

因为我们进行需要对结果进行排序,因此通过这个唯一索引,我们来了解下什么时候,排序用上了索引,什么情况下,排序并没有使用上索引。

排序用上了该索引的情况:

where rental_date = "2020-01-01" order by inventory_id desc

where rental_date > "2020-01-01" order by rental_date,inventory_id

上面两个查询因为都满足最左匹配的原则,所以都使用上了索引。

不能使用到该唯一索引的情况:

where rental_date = '2020-01-01' aorder by inventory_id DESC, customer_id ASC
 where rental_date = '2020-01-01' order by inventory_id, staff_id
where rental_date = '2020-01-01' order by customer_id
 where rental_date = '2020-01-01' and inventory_id in (1,2) order by customer_id

g tv

索引使用的一些小tip

上一篇 下一篇

猜你喜欢

热点阅读