優化總結
列名描述
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可以使用乙個...