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