mysql 关联查询_Mysql查询优化器,再也不会因为该什么时候建立索引发愁了
優化器的作用:
我們知道,一條SQL語句,可以有很多執行方式,最后都返回相同的結果,而優化器的作用就是找到最好的執行計劃。
一、RBO-基于規則的優化器(rule)
系統內置的一套硬編碼規則,根據規則生成執行計劃,無論表數據發生怎樣的變化,也不會影響執行計劃,也就是是RBO對數據不敏感;比如在規則中,索引的優先級大于全表掃描
二、CBO-基于成本的優化器(cost)
CBO優化器根據SQL語句生成一組可能被使用的執行計劃,估算出每個執行計劃的代價,選擇一個代價最小的執行計劃。
三、Mysql的查詢優化器
Mysql采用的是CBO-基于成本的優化器,它會嘗試估算一個查詢所有可能的執行計劃的成本,并選擇其中成本最小的一個執行計劃。成本的最小單位是隨機讀取一個4K的數據頁的成本;可以通過查詢當前會話的Last_query_cost的值獲取Mysql計算的當前查詢的成本。如下:
EXPLAIN SELECT * FROM `user` WHERE username='xxxx';
SHOW STATUS LIKE 'Last_query_cost';
1、 常用的優化類型
(1)、重新定義關聯表的順序
數據表的關聯并不總是按照在查詢中指定的順序執行。決定關聯的順序是優化器很重要的一部分功能。
(2)、將外連接轉為內連接
并不是所有的outer join 語句都必須以外連接的方式執行。例如where條件、庫表結構都可能會讓外連接等價一個內連接。MySQL能夠識別這點并重寫查詢,讓其可以調整關聯順序。
(3)、使用等價變化規則;可以合并和減少一些比較,還可以移除一些恒成立和恒不成立的判斷
MySQL可以使用一些等價變換來簡化并規范表達式。它可以合并和減少一些比較,還可以移除一些恒成立和一些恒不成立的判斷例如(8=8 and a>8)將被改寫成 a>8。
(4)、優化count()、min()和max()
count(*)、count(1)由于統計沒有明確的字段,所以查詢以行數為準,不會判斷某一列中的null值;
count(uid)則會判斷uid列中的null值,并把null值排除。
對max、min統計頻繁或數據量大的字段盡量添加索引,可以大大提高查詢統計的效率。
(5)、預估并轉化為常數表達式;當MySQL檢測到一個表達式可以轉化為常數時,就會一直把該表達式作為常數進行優化處理
(6)、覆蓋索引掃描;當掃描的索引列包含所有查詢中需要的使用的列時,MySQL就可以直接使用索引返回需要的數據。(explain分析extra值為use index)
2、關聯查詢排序優化
關聯查詢時使用排序,兩種情況:
(1)、order by子句的所有排序列都來自關聯的第一張表,mysql在關聯處理第一個表時就會進行文件排序。
(2)、除上述(1)中情況之外,mysql都會將關聯的結果存放在一個臨時表中,在所有關聯都結束之后,再進行文件排序。這點可以通過explain分析查詢語句查看extra里面的內容驗證。
(*)如果排序查詢中有LIMIT的話,LIMIT也會在排序之后應用,所以即使需要返回較少的數據,臨時表和需要排序的數據量仍然會非常大。
3、查詢優化器提示
(1)DELAYED
對于 INSERT 和 REPLACE 有效。
mysql 會將提示語句立即返回給客戶端, 并將插入的行數據放入到緩沖區, 然后在表空閑的時候批量將數據寫入。Innodb不支持。
(2)STRAIGHT_JOIN
在數據量大的聯表查詢中靈活運用的話,直接影響關聯順序, 減少statistics(統計)的時間, 能大大縮短查詢時間。 STRAIGHT_JOIN功能同join類似,但能讓左邊的表來驅動右邊的表,能改表優化器對于聯表查詢的執行順序。
(3)USE INDEX 、 IGNORE INDEX 、 FORCE INDEX
提示優化器使用不使用索引,USE INDEX 、 FORCE INDEX 使用基本一致,FORCE INDEX 更加強調全表掃描,代價更大。
4、什么時候該創建索引,實在無法決定,教你一招
索引選擇性 = 基數/總行數
比如:有一張user表,對表中nickname字段計算索引選擇性:
SELECT COUNT(DISTINCT(nickname))/COUNT(id) AS selectivity FROM user;
計算出selectivity的值就是選擇性,最大為1,值越大,選擇性越高,所以有時候索引的建立不僅跟表結構有關,還跟數據量結構和數據量有關。
好了,今天的分享就到這里,如果喜歡我的內容,歡迎收藏、轉發~~
謝謝!下期見。。。
總結
以上是生活随笔為你收集整理的mysql 关联查询_Mysql查询优化器,再也不会因为该什么时候建立索引发愁了的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: phalcon 访问IndexContr
- 下一篇: 成都大熊猫基地有婴儿车租吗