日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 关联查询_Mysql查询优化器,再也不会因为该什么时候建立索引发愁了

發布時間:2023/11/30 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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查询优化器,再也不会因为该什么时候建立索引发愁了的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。