mysql的索引掃瞄排序與全表排序

2021-09-28 19:36:55 字數 1811 閱讀 9650

目錄

一、排序方式

二、判斷

三、規則

四、舉例

mysql有兩種方式可以生產有序的結果:

1、通過排序操作;

2、按索引順序掃瞄;

通過explain出來的type列的值為「index」,則說明mysql使用了索引掃瞄來做排序。

掃瞄索引本身是很快的,因為只需要從一條索引記錄移動到緊接著的下一條記錄。但如果索引不能覆蓋查詢所需的全部列,那就不得不每掃瞄一條索引記錄就都回表查詢一次對應的行,這基本上都是隨機i/o.

1)只有當索引的列順序和order by 子句的順序完全一致,並且所有列的排序方向(倒序或正序)都一樣時,mysql才能夠使用索引來對結果做排序;

2)如果查詢需要關聯多張表,則只有當order by 子句引用的字段全部為第乙個表時,才能使用索引做排序;

3)order by 子句需要滿足索引的最左字首的要求

建表

create table rental (

...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)

);

搜尋排序:

select rental_id, staff_id from rental

wherer rental_date = '2005-05-25' order by inventory_id, customer_id;

即使order by 子句不滿足索引的最左字首的要求,也可以用於查詢排序,這是因為索引的第一列被指定為乙個常數。

可以視為將查詢列和排序列組合在一起,形成索引的最左字首。

wherer rental_date = '2005-05-25' order by inventory_id desc;

下面也符合,order by 使用的兩列是索引的最左字首。

wherer rental_date > '2005-05-25' order by rental_date, inventory_id;
下面試一些不能使用索引做排序的查詢:

wherer rental_date = '2005-05-25' order by inventory_id desc, customer_id asc;(兩種不同的排序方向)

wherer rental_date = '2005-05-25' order by inventory_id, staff_id;(order by引用乙個不再索引中的列)

wherer rental_date = '2005-05-25' order by customer_id;(where和order by中的列無法組合成索引的最左字首)

wherer rental_date > '2005-05-25' order by inventory_id, customer_id;(查詢索引是範圍條件)

wherer rental_date = '2005-05-25' and inventory_id in(1, 2) order by customer_id;

(inventory_id 列上有多個等於條件,對於排序來說,這也是一種範圍查詢)

全表掃瞄與索引掃瞄

一,全表掃瞄 全表掃瞄是從讀取資料的同時通過where條件中的查詢條件來過濾來篩選出滿足條件的資料執行過程。其掃瞄的的物件是表中的所有資料塊,包括空資料庫,如果表中的資料大量被刪除,那麼就會存在大量的空資料塊,再次狀態下,大量的空資料塊也被掃瞄。在執行全表掃瞄時,按照順序每次將多個資料塊從磁碟讀取到...

mysql 全表掃瞄 mysql的全表掃瞄

在mysql查詢中,如果表沒有索引的話,當查詢執行時,需要從第一行資料到最後一行資料進行全表掃瞄。索引的目的就是輔助查詢能快速定位到目標資料,然後獲取查詢結果。那麼表是否有了索引就一定能加以應用,而不會進行全表掃面了呢?現實肯定不是這樣的 1 全表掃瞄的場景 使用explain分析sql時,當列出執...

mysql全表掃瞄 mysql 全表掃瞄場景

全表掃瞄是資料庫搜尋表的每一條記錄的過程,直到所有符合給定條件的記錄返回為止。通常在資料庫中,對無索引的表進行查詢一般稱為全表掃瞄 然而有時候我們即便新增了索引,但當我們的sql語句寫的不合理的時候也會造成全表掃瞄。以下是經常會造成全表掃瞄的sql語句及應對措施 1.使用null做為判斷條件 如 s...