記面試中問到的MySQL的SQL調優問題

2021-10-10 08:00:53 字數 2892 閱讀 9716

面試官:小夥子,聽說你會sql調優,那我這裡有一條sql,你來幫我調優一下。sql如下:select * from t limit 899999, 10;表結構如下:

id int(10) primary key,

其他字段……

我:¿¿¿(緩緩打出反問號),這條sql要幹嘛,隨機找10條資料嗎?

面試官:哦,不好意思,忘記加上排序了select * from t order by id limit 899999, 10;

我:如果id是連續不中斷的話可以這樣寫。 sql如下:select * from t where id >= 899999 limit 0, 10;

面試官:那假如id不是連續的呢?

我:(略加思考)單從sql優化層面我優化不了了。

我:……

面試官:那最後你有什麼問題想問我的嗎?

我:剛才那條sql從sql層面上該如何優化?

面試官:你可以這樣寫:select * from t t where t.id >= (select f.id from t f order by id desc limit 899999, 1) limit 0, 10;

我:(假裝略加思考)你確定這樣寫會比圖一這條sql:select * from t order by id limit 899999, 10;更快嗎?在圖一的sql裡已經是通過主鍵索引去查詢資料了,你圖二的sql並沒有改變原有的查詢方式。如果你原有sql是通過其他欄位去排序的,用的是非主鍵索引,例如:select * from t order by createdtime limit 899999, 10;那麼你第二條sql的寫法確實會比第一條sql快得多,因為在mysql裡非主鍵索引與主鍵索引在查詢上的區別是,非主鍵索引他儲存的是索引列與主鍵列的值,查詢具體的值還需要一次回表過程,而主鍵索引儲存了是整行資料,不需要再次***回表***[^①]查詢,減少了一次查詢過程。

面試官:……

我:……

指查詢時通過非主鍵索引(非聚簇索引)去查詢對應的記錄的主鍵後,仍需要根據主鍵進行再一次的查詢,這是mysql的索引結構引起的。在mysql中,主鍵索引(聚簇索引)儲存的是一整行的資料,而非主鍵索引(非聚簇索引)儲存的是主鍵列的值。

假如有這樣一張表

create table person (

id int(11) not null,

name varchar(32) not null,

age int(11) not null,

primary key (id),

key idx_person_age (age)

) engine=innodb default charset=utf8mb4;

那這張表的索引具體表現形式如下:

主鍵索引:

非主鍵索引:

所以當我們需要查詢age=30的資料時,他的查詢過程如下圖:

如今我有這樣一張表:
create table file (

id int(11) not null auto_increment,

name varchar(255) default null,

created_time datetime not null,

updated_time datetime not null,

primary key (id),

key idx_file_created_time (created_time) using btree

) engine=innodb auto_increment=954185 default charset=utf8mb4;

表的資料數量為:

先來看看面試官說的情況

可以看出,查詢時間並沒有很大的差距,這是因為這兩條sql都是走的主鍵索引,方式並沒有很大的差別

而我列舉的情況,通過時間字段進行排序,讓其產生回表操作的過程。

可以看出,查詢時間出現了很大的差距,這是由於回表操作所造成的。

這個場景就發生在我上星期的面試中,我不知道這個面試官出這個題時是故意留坑還是什麼情況,但是在後面他給出他那答案時,實在是讓我驚訝,希望他是一時的錯誤,若是他對sql的本身理解就不熟悉,那就……………………
(1)在file表中,假如我所查詢的資料列只有id、created_time與updated_time,那麼還可以怎麼做?

(2)當真的只能通過id進行排序分頁時,我們該怎麼做?

面試中經常問到的問題

1 請你自我介紹一下你自己?謝謝 企業喜歡有禮貌的求職者。2 你覺得你個性上最大的優點是什麼?有好奇心 專注。3 說說你最大的缺點?我最大的缺點是過於追求完美 有的人以為這樣回答會顯得自己比較出色,但事實上,他已經岌岌可危了。企業喜歡求職者從自己的優點說起,中間加一些小缺點,最後再把問題轉回到優點上...

面試中被問到的概率題

問題描述 100人坐飛機,第乙個乘客在座位中隨便選乙個坐下,第100人正確坐到自己坐位的概率是?他們分別拿到了從1號到100號的座位,這些乘客會按號碼順序登機並應當對號入座,如果他們發現對應號座位被別人坐了,就會在剩下空的座位隨便挑乙個坐 現在假設1號乘客瘋了 其他人沒瘋 他會在100個座位中隨便選...

每次面試都被問到的linux

為了之後的面試,1.webbench webbench是乙個在linux下使用的非常簡單的 壓測工具。它使用fork 模擬多個客戶端同時訪問我們設定的url,測試 在壓力下工作的效能,最多可以模擬3萬個併發連線去測試 的負載能力。webbench使用c語言編寫,實在太簡潔,原始碼加起來不到600行。...