MySQL 如何優化

2021-10-24 10:06:08 字數 1928 閱讀 7114

優化總結

列名描述

type

針對單錶的訪問方法,至少要達到range級別,杜絕出現all級別

key實際上使用的索引,如果沒有選擇索引,值是null

ref當使用索引列等值查詢時,與索引列進行等值匹配的物件資訊

rows

預估的需要讀取的記錄條數

extra

額外的資訊

比如設計的聯合索引是 name_birthday_phone,那麼我們在sql中where後面需要按照這個順序

// 索引起效

select * from person_info where name = 'owater' and birthday = '2020-04-07';

// 索引失效

select * from person_info where birthday = '1990-09-27';

複製**

那最左字首原則有什麼作用呢?

那為什麼不按照這個順序,索引就失效了呢?

通常情況下一般都不太建議使用like,那麼該如何正確使用like呢?

首先,我們需先理清楚乙個字串索引在b+樹種是怎麼儲存?

aaple

azple

..baple

bbple

複製**

// 索引起效

select * from user where name like 'as%';

// 索引失效,%開始,程式不知從哪處開始查詢

select * from user where name like '%as%';

複製**

select * from user where name > 'owater' and name < 'water';

複製**

如上sql,即使是使用了索引,但是效率還是低,因為這過程發生了回表

從索引 name_birthday_phone 對應的b+樹中取出name值在owater~water之間的使用者記錄。此時是訪問二級索引使用順序i/o發現查詢列表是 ==*==,則需到聚集索引中查詢所有資料,這是所謂的回表。此時訪問聚集索引使用隨機i/o,順序i/o比隨機i/o的效能高很多。

假設一張表100w條資料,如果只是單獨使用limit,隨著偏移量越大效率越低,因為檢索需從某乙個偏移量到記錄集的結束所有的記錄行

// 效率低

select id, name, phone from user limit 100000, 20

select id, name, phone from user where id > 100000 limit 100000, 20

複製**

比如between,>,《等條件時,如果對多個列同時進行範圍查詢的話,只有對索引最左邊的那個列進行範圍查詢的時候才能用到b+樹索引。

select * from user where name > 'owater' and name < 'water' and birthday > '2020-04-09';

複製**

當掃瞄的行數成百萬級以上的時候,可以通過程式迴圈遍歷,分段去資料庫查詢資料,再將結果集進行合併,這樣可以減負資料庫單次執行的效能消耗。

mysql怎麼優化 MYSQL如何優化?

mysql如何優化?結合你的經驗 1.資料庫的設計 盡量把資料庫設計的更小的佔磁碟空間.1 盡可能使用更小的整數型別.mediumint就比int更合適 2 盡可能的定義欄位為not null,除非這個字段需要null.3 如果沒有用到變長字段的話比如varchar,那就採用固定大小的紀錄格式比如c...

如何MySQL優化總結 mysql優化小結

目標 掌握常見的優化方法 一.如何通過慢日誌發現有問題的sql?1 查詢次數多且每次查詢占用時間長的sql 通過pt query digest分析查詢sql 2 io比較大的sql 通過pt query digest分析rows examine項 3 未命中索引的sql 通過pt query dig...

MySQL如何優化ORDER BY

某些情況中,mysql可以使用乙個索引來滿足order by子句,而不需要額外的排序。即使order by不確切匹配索引,只要where子句中的所有未使用的索引部分和所有額外的order by 列為常數,就可以使用索引。下面的查詢使用索引來解決order by部分 某些情況中,mysql可以使用乙個...