平常開發中,編寫SQL語句都避免不了使用到WHERE
關鍵字作條件過濾,細心的朋友就會發現,WHERE的不一樣表現形式會對數據庫性能形成必定影響,本章主要針對WHERE
優化策略進行討論....
<!-- more -->mysql
SELECT .... WHERE ...
變快,第一就是檢查一下是否能夠增長索引。在WHERE子句中建立索引,能夠加快求值、過濾、和最終檢索結果的速度。爲避免浪費磁盤空間,能夠經過建立聯合索引來加速多個相關查詢。MySQL
沒法進行優化EXPLAIN
計劃MySQL
用於緩存數據的內存大小在作JAVA開發中,經過指令重拍會對代碼作必定程度的優化,在數據庫中MYSQL優化器
也作了一系列相關優化工做,下面要介紹的就是數據庫作的內置優化sql
方案一: 刪除沒必要要的括號
((a AND b) AND c OR (((a AND b) AND (c AND d)))) -> (a AND b AND c) OR (a AND b AND c AND d)
方案二: 常量摺疊/常量疊算
(a<b AND b=c) AND a=5 -> b>5 AND b=c AND a=5
更多: 其餘方案
const
的查詢方式(主鍵查詢)MySQL
會及時發現無效SELECT
語句,而後不返回數據。WHERE
查詢中發現未使用GROUP BY
或者聚合函數(好比COUNT(),MIN()等)
,那麼HAVING
會與WHERE
合併。MYSQL
會對錶進行評估從而構造出更簡單的查詢優先讀取常量表數據庫
WHERE
子句在PRIMARY KEY
或者UNIQUE INDEX
上的表,其中索引和常量表達式做比較,並被定義爲NOT NULL
。緩存
SELECT * FROM t WHERE primary_key = 1; SELECT * FROM t1,t2 WHERE t1.primary_key= 1 AND t2.primary_key = t1.id;
MySQL
會去嘗試全部的可能性,從而發現最好的的組合方式。當ORDER BY
和GROUP BY
子句的列都位於同一個表時,該表將會第一個被連接。ORDER BY
和 GROUP BY
字段不一樣,或是除join queue中的第一個表以外其它含有ORDER BY
或 GROUP BY
的表都會爲其建立臨時表SQL_SMALL_RESULT
選項,那麼MySQL就會在內存中建立一個臨時表。MySQL
每次查詢時都會檢查是否有可用索引,除非MySQL優化器
認爲全表掃描性能更快。早期版本中認爲索引掃描行佔30%
的時候就會換成全表掃描,但進過改進後,如今將根據表的大小、行的數目、I/O塊大小
等綜合評估MySQL
會直接跳過數據文件直接從索引中讀取內容(好比: 索引列都是數字,那麼這時候會直接解析索引樹)HAVING條件
的內容查詢快慢除軟硬件優化外,索引是必不可少,下面列舉一些使用索引提供查詢速度的示例。微信
高效查詢
SELECT COUNT(*) FROM tbl_name; SELECT MIN(key_part1),MAX(key_part1) FROM tbl_name; SELECT MAX(key_part2) FROM tbl_name WHERE key_part1 = constant; SELECT ... FROM tbl_name ORDER BY key_part1,key_part2,... LIMIT 10; SELECT ... FROM tbl_name ORDER BY key_part1 DESC, key_part2 DESC, ... LIMIT 10;
索引樹查詢(索引列是數字的狀況下)
SELECT key_part1,key_part2 FROM tbl_name WHERE key_part1 = val; SELECT COUNT(*) FROM tbl_name WHERE key_part1 = val1 AND key_part2 = val2; SELECT key_part2 FROM tbl_name GROUP BY key_part1;
索引排序(無需單獨排序傳遞)
SELECT ... FROM tbl_name ORDER BY key_part1,key_part2,... ; SELECT ... FROM tbl_name ORDER BY key_part1 DESC, key_part2 DESC, ... ;
最好的優化方案,跟着新版本走推陳出新
,新版中不只擴展更多功能,同時會增強優化力度。雖然MySQL優化器
爲咱們作了不少事情,但開發過程當中改主意還得注意。架構
祝各位元旦快樂,吃嘛嘛香,2018裏把全部吹的牛逼都給實現咯。函數
關注微信公衆號:battcn
後臺回覆 mysql
便可得到 《打造扛得住的MySQL數據庫架構》
性能