oracle 几个字段中某个字段大于0其他字段不再进行统计?_如何深入理解MySQL 8.0直方图?...
MySQL8.0 新功能直方圖,繼承于Oracle ,MairaDB的實現(xiàn)方式。 那下面從mysql角度認識下,直方圖是什么。先看下官方直方圖的實現(xiàn)方式。
從上圖上可以看到原來是ANALYZE命令。先了解一下MySQL里 ANALYZE命令到底有什么用。
ANALYZE在MySQL里提交一條查詢SQL語句時,優(yōu)化器會選在一個最優(yōu)的執(zhí)行方案,并用最小的代價去執(zhí)行語句。在數(shù)據(jù)庫里面,掃描行數(shù)是影響執(zhí)行代價的因素之一。掃描的行數(shù)越少,意味著資源資源越少,掃描行數(shù)是怎么判斷,是通過索引的基數(shù)來得到值和row。
mysql>SHOW INDEX FROM table_name執(zhí)行計劃里出現(xiàn)的Cardinality(基數(shù))字段,是非常重要的: 基數(shù)計算是采樣統(tǒng)計,如果把整張表取出來一行行統(tǒng)計,雖然可以得到精確的結果,但是代價太高。采樣統(tǒng)計的時候InnoDB 默認會選擇 N 個數(shù)據(jù)頁,統(tǒng)計這些頁面上的不同值,得到一個平均值,然后乘以這個索引的頁面數(shù),就得到了這個索引的基數(shù)。而數(shù)據(jù)表是會持續(xù)更新的,索引統(tǒng)計信息也不會固定不變。所以,當變更的數(shù)據(jù)行數(shù)超過 1/M 的時候,會自動觸發(fā)重新做一次索引統(tǒng)計。
基數(shù)很容易不準,除了基數(shù)優(yōu)化器還要判斷,執(zhí)行這個語句本身要掃描多少rows 預計掃描行數(shù).
因為統(tǒng)計信息不對,cardinality大大少于數(shù)據(jù)的實際散列程度,那么索引就有可能失效。
下面看看基數(shù)變化的情況: 1.第一次創(chuàng)建表導入數(shù)
2.第二次把表drop掉,導入數(shù)據(jù)
在這種情況下就會使用analyze table 命令2次
上面是2次,ANALYZE TABLE命令進行修復索引。在不停的浮動。 分析表通過對每個索引樹執(zhí)行隨機潛水并相應地更新索引基數(shù)估計值來確定索引基數(shù),所以這個值也不是100%準確。
ANALYZE TABLE的作用:
- 統(tǒng)計索引分布信息。
- 對于 MyISAM 表,相當于執(zhí)行了一次 myisamchk --analyze
- 支持 InnoDB.NDB.MyISAM 等存儲引擎,但不支持視圖(view)
- 執(zhí)行時,會對表加上讀鎖(read lock)
- 該操作會記錄binlog,可以在analyze和table之間添加關鍵字local取消寫入
ANALYZE TABLE風險:
- analyze table的需要掃描的page代價粗略估算公式:sample_pages * 索引數(shù) * 表分區(qū)數(shù)。
- 因此,索引數(shù)量較多,或者表分區(qū)數(shù)量較多時,可能會比較費時,要評估代價,并默認只在負載低谷時執(zhí)行。
- 如果某個表上當前有慢SQL,此時執(zhí)行analyze table,則該表后續(xù)的查詢均會處于waiting for table flush的狀態(tài),嚴重的話會影響業(yè)務,因此執(zhí)行前必須先檢查有無慢查詢。
通過ANALYZE操作了解到,在數(shù)據(jù)庫中查詢優(yōu)化所需的指標抽取方式。有時候,查詢優(yōu)化器會走不到最優(yōu)的執(zhí)行計劃,導致花費了更多不必要的時間。直方圖就是解決這樣的問題.
直方圖能近似獲得一列的數(shù)據(jù)分布情況,從而讓數(shù)據(jù)庫知道它含有哪些數(shù)據(jù)。將數(shù)據(jù)分到了一系列的buckets中去。MySQL會自動將數(shù)據(jù)劃到不同的buckets中,也會自動決定創(chuàng)建哪種類型的直方圖。
1)從代碼實現(xiàn)中,MySQL支持了兩種:等寬直方圖(singleton).等高直方圖(equi-height)。
2)兩個直方圖區(qū)別在于equi-height 多了 下限和上限的指標。
3)選擇直方圖判斷邏輯是:如果指定的桶數(shù)大于或等于桶數(shù) 對于不同的值,創(chuàng)建一個單例直方圖。否則創(chuàng)建一個等高直方圖。
...
本文接下來還有:
完整內容,請訪問墨天輪平臺【原文】進行查看~
總結
以上是生活随笔為你收集整理的oracle 几个字段中某个字段大于0其他字段不再进行统计?_如何深入理解MySQL 8.0直方图?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ftp服务器文件名存在,有什么办法根据已
- 下一篇: mysql登录root 1130_通过N