精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

MySQL 8.0新特性之統(tǒng)計(jì)直方圖

數(shù)據(jù)庫(kù) MySQL
MySQL8.0實(shí)現(xiàn)了統(tǒng)計(jì)直方圖。利用直方圖,用戶可以對(duì)一張表的一列做數(shù)據(jù)分布的統(tǒng)計(jì),特別是針對(duì)沒有索引的字段。這可以幫助查詢優(yōu)化器找到更優(yōu)的執(zhí)行計(jì)劃。

 

概覽

MySQL8.0實(shí)現(xiàn)了統(tǒng)計(jì)直方圖。利用直方圖,用戶可以對(duì)一張表的一列做數(shù)據(jù)分布的統(tǒng)計(jì),特別是針對(duì)沒有索引的字段。這可以幫助查詢優(yōu)化器找到更優(yōu)的執(zhí)行計(jì)劃。統(tǒng)計(jì)直方圖的主要使用場(chǎng)景是用來計(jì)算字段選擇性,即過濾效率。

可以通過以下方式來創(chuàng)建或者刪除直方圖: 

  1. ANALYZE TABLE tbl_name UPDATE HISTOGRAM ON col_name [, col_name] WITH N BUCKETS;  
  2. ANALYZE TABLE tbl_name DROP HISTOGRAM ON col_name [, col_name]; 

buckets默認(rèn)是100。統(tǒng)計(jì)直方圖的信息存儲(chǔ)在數(shù)據(jù)字典表"column_statistcs"中,可以通過視圖information_schema.COLUMN_STATISTICS訪問。直方圖以靈活的JSON的格式存儲(chǔ)。ANALYZE TABLE會(huì)基于表大小自動(dòng)判斷是否要進(jìn)行取樣操作。ANALYZE TABLE也會(huì)基于表中列的數(shù)據(jù)分布情況以及bucket的數(shù)量來決定是否要建立等寬直方圖(singleton)還是等高直方圖(equi-height)。

什么是直方圖

數(shù)據(jù)庫(kù)中,查詢優(yōu)化器負(fù)責(zé)將SQL轉(zhuǎn)換成最有效的執(zhí)行計(jì)劃。有時(shí)候,查詢優(yōu)化器會(huì)走不到最優(yōu)的執(zhí)行計(jì)劃,導(dǎo)致花費(fèi)了更多不必要的時(shí)間。造成這種情況的主要原因是,查詢優(yōu)化器有時(shí)無法準(zhǔn)確的知道以下幾個(gè)問題的答案:

  •  每個(gè)表有多少行?
  •  每一列有多少不同的值?
  •  每一列的數(shù)據(jù)分布情況?

舉例說明:一張簡(jiǎn)單的表,兩個(gè)字段,一個(gè)字段是person_id,另一個(gè)字段是time_of_day,表示睡覺時(shí)間 

  1. CREATE TABLE bedtime (  
  2. person_id INT,  
  3. time_of_day TIME); 

對(duì)于time_of_day列,大部分人上床時(shí)間會(huì)在晚上11:00左右。所以下面第一個(gè)查詢會(huì)比第二個(gè)查詢返回更多的行數(shù): 

  1. 1) SELECT * FROM bedtime WHERE time_of_day BETWEEN "22:00:00" AND "23:59:00"  
  2. 2) SELECT * FROM bedtime WHERE time_of_day BETWEEN "12:00:00" AND "14:00:00" 

如果沒有統(tǒng)計(jì)數(shù)據(jù),優(yōu)化器會(huì)假設(shè)time_of_day的值是均勻分配的,即一個(gè)人的上床時(shí)間在下午3點(diǎn)和晚上11點(diǎn)的概率差不多。如何才能使查詢優(yōu)化器知道數(shù)據(jù)的分布情況?一個(gè)解決方法就是在列上建立統(tǒng)計(jì)直方圖。

直方圖能近似獲得一列的數(shù)據(jù)分布情況,從而讓數(shù)據(jù)庫(kù)知道它含有哪些數(shù)據(jù)。直方圖有多種形式,MySQL支持了兩種:等寬直方圖(singleton)、等高直方圖(equi-height)。直方圖的共同點(diǎn)是,它們都將數(shù)據(jù)分到了一系列的buckets中去。MySQL會(huì)自動(dòng)將數(shù)據(jù)劃到不同的buckets中,也會(huì)自動(dòng)決定創(chuàng)建哪種類型的直方圖。

如何創(chuàng)建和刪除統(tǒng)計(jì)直方圖

為了管理統(tǒng)計(jì)直方圖,ANALYZE TABLE命令新增了兩個(gè)子句: 

  1. ANALYZE TABLE tbl_name UPDATE HISTOGRAM ON col_name [, col_name] WITH N BUCKETS;  
  2. ANALYZE TABLE tbl_name DROP HISTOGRAM ON col_name [, col_name]; 

第一個(gè)表示一次可以為一個(gè)或多個(gè)列創(chuàng)建統(tǒng)計(jì)直方圖: 

  1. mysql> ANALYZE TABLE payment UPDATE HISTOGRAM ON amount WITH 32 BUCKETS;  
  2. +----------------+-----------+----------+---------------------------------------------------+  
  3. | Table          | Op        | Msg_type | Msg_text                                         |  
  4. +----------------+-----------+----------+---------------------------------------------------+  
  5. | sakila.payment | histogram | status   | Histogram statistics created for column 'amount'. |  
  6. +----------------+-----------+----------+---------------------------------------------------+  
  7. 1 row in set (0.27 sec)  
  8. mysql> ANALYZE TABLE payment UPDATE HISTOGRAM ON amount, payment_date WITH 32 BUCKETS;  
  9. +----------------+-----------+----------+---------------------------------------------------------+  
  10. | Table          | Op        | Msg_type | Msg_text                                                |  
  11. +----------------+-----------+----------+---------------------------------------------------------+  
  12. | sakila.payment | histogram | status   | Histogram statistics created for column 'amount'.       |  
  13. | sakila.payment | histogram | status   | Histogram statistics created for column 'payment_date'. |  
  14. +----------------+-----------+----------+---------------------------------------------------------+ 

buckets的值必須指定,可以設(shè)置為1到1024,默認(rèn)值是100。 

對(duì)于不同的數(shù)據(jù)集合,buckets的值取決于以下幾個(gè)因素:

  •  這列有多少不同的值
  •  數(shù)據(jù)的分布情況
  •  需要多高的準(zhǔn)確性

但是,某些buckets的值能提升的關(guān)于數(shù)據(jù)分布情況的準(zhǔn)確性相當(dāng)?shù)?。所以,建議的做法是,開始的時(shí)候?qū)uckets的值設(shè)的低一點(diǎn),比如32,然后如果沒有滿足期望,再往上增大。

上面這個(gè)例子中,我們對(duì)于amount列建立了兩次直方圖。第一個(gè)語(yǔ)句,建立了一個(gè)新的直方圖;第二個(gè)語(yǔ)句,amount列的直方圖被重寫了。

如果需要?jiǎng)h除已經(jīng)創(chuàng)建的直方圖,用DROP HISTOGRAM就可以實(shí)現(xiàn): 

  1. mysql> ANALYZE TABLE payment DROP HISTOGRAM ON payment_date;  
  2. +----------------+-----------+----------+---------------------------------------------------------+  
  3. | Table          | Op        | Msg_type | Msg_text                                                |  
  4. +----------------+-----------+----------+---------------------------------------------------------+  
  5. | sakila.payment | histogram | status   | Histogram statistics removed for column 'payment_date'. |  
  6. +----------------+-----------+----------+---------------------------------------------------------+ 

UPDATE HISTOGRAM可以一次性為多個(gè)列創(chuàng)建直方圖。如果命令中間寫錯(cuò),ANALYZE TABLE仍然會(huì)起作用。比如,你指定了三列,但第二列不存在。MySQL仍然會(huì)為第一列和第三列創(chuàng)建直方圖。 

  1. mysql> ANALYZE TABLE customer UPDATE HISTOGRAM ON c_birth_day, c_foobar, c_birth_month WITH 32 BUCKETS;  
  2. +----------------+-----------+----------+----------------------------------------------------------+  
  3. | Table          | Op        | Msg_type | Msg_text                                                 |  
  4. +----------------+-----------+----------+----------------------------------------------------------+  
  5. | tpcds.customer | histogram | status   | Histogram statistics created for column 'c_birth_day'.   |  
  6. | tpcds.customer | histogram | status   | Histogram statistics created for column 'c_birth_month'. |  
  7. | tpcds.customer | histogram | Error    | The column 'c_foobar' does not exist.                    | 
  8. +----------------+-----------+----------+----------------------------------------------------------+  
  9. 3 rows in set (0.15 sec) 

數(shù)據(jù)庫(kù)內(nèi)部發(fā)生了什么

當(dāng)你讀過MySQL手冊(cè),你可能已經(jīng)注意到新的系統(tǒng)變量histogram_generation_max_mem_size。當(dāng)用戶建立統(tǒng)計(jì)直方圖,這個(gè)值是用來控制大約多少內(nèi)存能允許被使用。那么,為什么要控制這個(gè)呢?

當(dāng)你在建立直方圖的時(shí)候,MySQL server會(huì)將所有數(shù)據(jù)讀到內(nèi)存中,然后在內(nèi)存中進(jìn)行操作,包括排序。如果對(duì)一個(gè)很大的表建立直方圖,可能會(huì)有風(fēng)險(xiǎn)將幾百M(fèi)的數(shù)據(jù)都讀到內(nèi)存中,但這是不明智的。為了規(guī)避這個(gè)風(fēng)險(xiǎn),MySQL會(huì)根據(jù)給定的histogram_generation_max_mem_size的值計(jì)算該將多少行數(shù)據(jù)讀到內(nèi)存中。如果根據(jù)當(dāng)前histogram_generation_max_mem_size的限制,MySQL認(rèn)為只能讀一部分?jǐn)?shù)據(jù),那么MySQL會(huì)進(jìn)行取樣。通過“sampling-rate”屬性,可以觀察到取樣比率。 

  1. mysql> SET histogram_generation_max_mem_size = 1000000 
  2. Query OK, 0 rows affected (0.00 sec)  
  3. mysql> ANALYZE TABLE customer UPDATE HISTOGRAM ON c_birth_country WITH 16 BUCKETS;  
  4. +----------------+-----------+----------+------------------------------------------------------------+  
  5. | Table | Op | Msg_type | Msg_text |  
  6. +----------------+-----------+----------+------------------------------------------------------------+  
  7. | tpcds.customer | histogram | status | Histogram statistics created for column 'c_birth_country'. |  
  8. +----------------+-----------+----------+------------------------------------------------------------+  
  9. 1 row in set (0.22 sec)  
  10. mysql> SELECT histogram->>'$."sampling-rate"'  
  11. -> FROM information_schema.column_statistics  
  12. -> WHERE table_name = "customer"  
  13. -> AND column_name = "c_birth_country" 
  14. +---------------------------------+  
  15. | histogram->>'$."sampling-rate"' |  
  16. +---------------------------------+  
  17. | 0.048743243211626014 |  
  18. +---------------------------------+  
  19. 1 row in set (0.00 sec) 

優(yōu)化器創(chuàng)建了一個(gè)直方圖,大約讀了c_birth_country列4.8%的數(shù)據(jù)。取樣是不確定的,因此意義不大。同樣的數(shù)據(jù),同樣的兩條語(yǔ)句‘‘ANALYZE TABLE tbl UPDATE HISTOGRAM …’’,如果用了取樣,得到的直方圖可能就不一樣。

查詢案例

統(tǒng)計(jì)直方圖可以帶來些什么?我們可以看個(gè)例子,這個(gè)例子中用了直方圖,在執(zhí)行時(shí)間上會(huì)有很大的不同。

環(huán)境:   

  1. TPC-DS Benchmark with scale factor of 1  
  2.     Intel Core i7-4770  
  3.     Debian Stretch  
  4.     MySQL 8.0 RC1  
  5.     innodb_buffer_pool_size = 2G  
  6.     optimizer_switch = "condition_fanout_filter=on" 

Query 90

查詢?nèi)缦拢荷衔缡圪u的數(shù)量與晚上售賣的數(shù)量的比率。 

  1. mysql> SELECT CAST(amc AS DECIMAL(15, 4)) / CAST(pmc AS DECIMAL(15, 4)) am_pm_ratio  
  2. -> FROM (SELECT COUNT(*) amc  
  3. ->              FROM web_sales,  
  4. ->                          household_demographics,  
  5. ->                          time_dim,  
  6. ->                          web_page  
  7. ->             WHERE ws_sold_time_sk = time_dim.t_time_sk  
  8. ->                          AND ws_ship_hdemo_sk = household_demographics.hd_demo_sk  
  9. ->                          AND ws_web_page_sk = web_page.wp_web_page_sk  
  10. ->                          AND time_dim.t_hour BETWEEN 9 AND 9 + 1  
  11. ->                          AND household_demographics.hd_dep_count = 2  
  12. ->                          AND web_page.wp_char_count BETWEEN 5000 AND 5200) at,  
  13. ->              (SELECT COUNT(*) pmc  
  14. ->               FROM web_sales,  
  15. ->                          household_demographics,  
  16. ->                          time_dim,  
  17. ->                          web_page  
  18. ->              WHERE ws_sold_time_sk = time_dim.t_time_sk  
  19. ->                            AND ws_ship_hdemo_sk = household_demographics.hd_demo_sk  
  20. ->                            AND ws_web_page_sk = web_page.wp_web_page_sk  
  21. ->                            AND time_dim.t_hour BETWEEN 15 AND 15 + 1  
  22. ->                            AND household_demographics.hd_dep_count = 2  
  23. ->                            AND web_page.wp_char_count BETWEEN 5000 AND 5200) pt  
  24. -> ORDER BY am_pm_ratio  
  25. -> LIMIT 100;  
  26. +-------------+  
  27. | am_pm_ratio |  
  28. +-------------+  
  29. | 1.27619048 |  
  30. +-------------+  
  31. 1 row in set (1.48 sec) 

可以看到,查詢花費(fèi)了1.5秒左右??雌饋聿凰愣?,但是通過在一列上建立直方圖,可以讓執(zhí)行速度快三倍。 

  1. mysql> ANALYZE TABLE web_page UPDATE HISTOGRAM ON wp_char_count WITH 8 BUCKETS;  
  2. +----------------+-----------+----------+----------------------------------------------------------+  
  3. | Table | Op | Msg_type | Msg_text |  
  4. +----------------+-----------+----------+----------------------------------------------------------+  
  5. | tpcds.web_page | histogram | status | Histogram statistics created for column 'wp_char_count'. |  
  6. +----------------+-----------+----------+----------------------------------------------------------+  
  7. 1 row in set (0.06 sec)  
  8. mysql> SELECT ...  
  9. +-------------+  
  10. | am_pm_ratio |  
  11. +-------------+  
  12. | 1.27619048 |  
  13. +-------------+  
  14. 1 row in set (0.50 sec) 

通過這個(gè)直方圖,查詢花費(fèi)了0.5秒左右。原因呢?主要的原因是,查詢語(yǔ)句中的謂詞“web_page.wp_char_count BETWEEN 5000 AND 5200”。沒有直方圖的時(shí)候,優(yōu)化器會(huì)假設(shè)web_page表中符合謂詞“web_page.wp_char_count BETWEEN 5000 AND 5200”的數(shù)據(jù)占到總數(shù)據(jù)11.11%左右。但,這是錯(cuò)誤的。用下面的查詢語(yǔ)句,可以看到實(shí)際上滿足條件的數(shù)據(jù)只有1.6%。 

  1. mysql> SELECT  
  2. -> (SELECT COUNT(*) FROM web_page WHERE web_page.wp_char_count BETWEEN 5000 AND 5200)  
  3. -> /  
  4. -> (SELECT COUNT(*) FROM web_page) AS ratio;  
  5. +--------+  
  6. | ratio |  
  7. +--------+  
  8. | 0.0167 |  
  9. +--------+  
  10. 1 row in set (0.00 sec) 

通過直方圖,優(yōu)化器會(huì)知道這個(gè)信息,并且更早進(jìn)行表join,因此執(zhí)行時(shí)間快了三倍。

Query 61

查詢?nèi)缦拢涸诮o定的年份和月份,有和沒有廣告宣傳的情況下貨物的售賣比率。 

  1. mysql> SELECT promotions,                                                                                                                                                                                        ->        total, 
  2.  
  3. ->        CAST(promotions AS DECIMAL(15, 4)) / CAST(total AS DECIMAL(15, 4)) * 100  
  4. -> FROM   (SELECT SUM(ss_ext_sales_price) promotions  
  5. ->         FROM   store_sales,  
  6. ->                store,  
  7. ->                promotion,  
  8. ->                date_dim,  
  9. ->                customer,  
  10. ->                customer_address,  
  11. ->                item  
  12. ->         WHERE  ss_sold_date_sk = d_date_sk  
  13. ->                AND ss_store_sk = s_store_sk  
  14. ->                AND ss_promo_sk = p_promo_sk  
  15. ->                AND ss_customer_sk = c_customer_sk  
  16. ->                AND ca_address_sk = c_current_addr_sk  
  17. ->                AND ss_item_sk = i_item_sk  
  18. ->                AND ca_gmt_offset = -5  
  19. ->                AND i_category = 'Home'  
  20. ->                AND ( p_channel_dmail = 'Y'  
  21. ->                       OR p_channel_email = 'Y'  
  22. ->                       OR p_channel_tv = 'Y' ) 
  23. ->                AND s_gmt_offset = -5  
  24. ->                AND d_year = 2000  
  25. ->                AND d_moy = 12) promotional_sales,  
  26. ->        (SELECT SUM(ss_ext_sales_price) total  
  27. ->         FROM   store_sales,  
  28. ->                store,  
  29. ->                date_dim,  
  30. ->                customer,  
  31. ->                customer_address,  
  32. ->                item  
  33. ->         WHERE  ss_sold_date_sk = d_date_sk  
  34. ->                AND ss_store_sk = s_store_sk  
  35. ->                AND ss_customer_sk = c_customer_sk  
  36. ->                AND ca_address_sk = c_current_addr_sk  
  37. ->                AND ss_item_sk = i_item_sk  
  38. ->                AND ca_gmt_offset = -5  
  39. ->                AND i_category = 'Home'  
  40. ->                AND s_gmt_offset = -5  
  41. ->                AND d_year = 2000  
  42. ->                AND d_moy = 12) all_sales  
  43. -> ORDER  BY promotions,  
  44. ->           total  
  45. -> LIMIT  100;  
  46. +------------+------------+--------------------------------------------------------------------------+  
  47. | promotions | total      | CAST(promotions AS DECIMAL(15, 4)) / CAST(total AS DECIMAL(15, 4)) * 100 |  
  48. +------------+------------+--------------------------------------------------------------------------+  
  49. | 3213210.07 | 5966836.78 |                                                              53.85114741 |  
  50. +------------+------------+--------------------------------------------------------------------------+  
  51. 1 row in set (2.78 sec) 

可以看到,查詢花費(fèi)了2.8秒左右。但是,查詢優(yōu)化器不知道s_gmt_offset列只有一個(gè)不同的值。沒有統(tǒng)計(jì)數(shù)據(jù)的情況下,優(yōu)化器會(huì)用所謂的“hard-coded guesstimates”,會(huì)假設(shè)10%的數(shù)據(jù)符合條件“ca_gmt_offset = -5“。如果在這個(gè)列上增加一個(gè)直方圖,優(yōu)化器會(huì)知道所有的數(shù)據(jù)都符合條件,因此會(huì)走一個(gè)更好的執(zhí)行計(jì)劃。 

  1. mysql> ANALYZE TABLE store UPDATE HISTOGRAM ON s_gmt_offset WITH 8 BUCKETS;  
  2. +-------------+-----------+----------+---------------------------------------------------------+  
  3. | Table       | Op        | Msg_type | Msg_text                                                |  
  4. +-------------+-----------+----------+---------------------------------------------------------+  
  5. | tpcds.store | histogram | status   | Histogram statistics created for column 's_gmt_offset'. |  
  6. +-------------+-----------+----------+---------------------------------------------------------+  
  7. 1 row in set (0.06 sec)  
  8. mysql> SELECT ...  
  9. +------------+------------+--------------------------------------------------------------------------+  
  10. | promotions | total      | CAST(promotions AS DECIMAL(15, 4)) / CAST(total AS DECIMAL(15, 4)) * 100 |  
  11. +------------+------------+--------------------------------------------------------------------------+  
  12. | 3213210.07 | 5966836.78 |                                                              53.85114741 |  
  13. +------------+------------+--------------------------------------------------------------------------+  
  14. 1 row in set (1.37 sec) 

有了直方圖,查詢花了不到1.4秒,差不多提升了2倍。原因是:

  •  第一個(gè)執(zhí)行計(jì)劃,優(yōu)化器選擇了第一個(gè)派生表在store表上做了全表掃描,然后對(duì)表item, store_sales, date_dim, customer,customer_address分別做了主鍵查找。
  •  但是,當(dāng)MySQL意識(shí)到store表會(huì)比它猜測(cè)的返回更多的數(shù)據(jù)時(shí),優(yōu)化器會(huì)在item表上做全表掃描,然后對(duì)store_sales, store, date_dim, customer,customer_address 分別做主鍵查找。

為什么不用索引?

索引往往也能做上述工作,比如: 

  1. mysql> CREATE INDEX s_gmt_offset_idx ON store (s_gmt_offset);  
  2. Query OK, 0 rows affected (0.53 sec)  
  3. Records: 0  Duplicates: 0  Warnings: 0  
  4. mysql> SELECT ...  
  5. +------------+------------+--------------------------------------------------------------------------+  
  6. | promotions | total      | CAST(promotions AS DECIMAL(15, 4)) / CAST(total AS DECIMAL(15, 4)) * 100 |  
  7. +------------+------------+--------------------------------------------------------------------------+  
  8. | 3213210.07 | 5966836.78 |                                                              53.85114741 |  
  9. +------------+------------+--------------------------------------------------------------------------+  
  10. 1 row in set (1.41 sec) 

但是,用直方圖而不是索引有以下兩個(gè)原因:

  • 維護(hù)一個(gè)索引有代價(jià)。每一次的insert、update、delete都會(huì)需要更新索引,會(huì)對(duì)性能有一定的影響。而直方圖一次創(chuàng)建永不更新,除非明確去更新它。所以不會(huì)影響insert、update、delete的性能。
  • 如果有索引,優(yōu)化器用使用index dives技術(shù)來估算符合條件范圍的記錄數(shù)量。這種方式也是有代價(jià)的,特別是查詢語(yǔ)句條件中有很長(zhǎng)的IN列表。直方圖相對(duì)而言代價(jià)小,因此可能更合適。

檢索統(tǒng)計(jì)直方圖

統(tǒng)計(jì)直方圖以JSON的形式存在數(shù)據(jù)字典中??梢杂脙?nèi)建的JSON函數(shù)built-in JSON functions從直方圖獲取一些信息。舉例來說,如果需要知道amount列的直方圖的創(chuàng)建或者更新時(shí)間,可以用JSON unquoting extraction operator來獲取信息: 

  1. mysql> SELECT  
  2. ->   HISTOGRAM->>'$."last-updated"' AS last_updated  
  3. -> FROM INFORMATION_SCHEMA.COLUMN_STATISTICS  
  4. -> WHERE  
  5. ->   SCHEMA_NAME = "sakila"  
  6. ->   AND TABLE_NAME = "payment"  
  7. ->   AND COLUMN_NAME = "amount" 
  8. +----------------------------+  
  9. | last_updated               |  
  10. +----------------------------+  
  11. | 2017-09-15 11:54:25.000000 |  
  12. +----------------------------+ 

如果要查找實(shí)際有多少個(gè)buckets,以及用analyze table時(shí)指定了多少個(gè)buckets,可以如下: 

  1. mysql> SELECT  
  2. ->   TABLE_NAME,  
  3. ->   COLUMN_NAME,  
  4. ->   HISTOGRAM->>'$."number-of-buckets-specified"' AS num_buckets_specified,  
  5. ->   JSON_LENGTH(HISTOGRAM, '$.buckets') AS num_buckets_created  
  6. -> FROM INFORMATION_SCHEMA.COLUMN_STATISTICS  
  7. -> WHERE  
  8. ->   SCHEMA_NAME = "sakila"; 
  9. +------------+--------------+-----------------------+---------------------+  
  10. | TABLE_NAME | COLUMN_NAME  | num_buckets_specified | num_buckets_created |  
  11. +------------+--------------+-----------------------+---------------------+  
  12. | payment    | amount       | 32                    |                  19 |  
  13. | payment    | payment_date | 32                    |                  32 |  
  14. +------------+--------------+-----------------------+---------------------+ 

經(jīng)測(cè)試,num_buckets_created與字段的distinct值很接近,近似相等;但是num_buckets_created不會(huì)大于num_buckets_specified。如果num_buckets_created與num_buckets_specified相等,那么存在可能,在創(chuàng)建直方圖的時(shí)候指定的buckets不夠多,那么此時(shí)可以通過增加buckets的數(shù)量,來提高直方圖的準(zhǔn)確性。 

buckets可以設(shè)置為1到1024

優(yōu)化器trace

如果你想要知道直方圖做了什么,最簡(jiǎn)單的方式就是看一下執(zhí)行計(jì)劃: 

  1. mysql> EXPLAIN SELECT * FROM customer WHERE c_birth_day BETWEEN 1 AND 10;  
  2. +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+  
  3. | id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows  | filtered | Extra       |  
  4. +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+  
  5. |  1 | SIMPLE      | customer | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 98633 |    11.11 | Using where |  
  6. +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+  
  7. 1 row in set, 1 warning (0.00 sec)  
  8. mysql> ANALYZE TABLE customer UPDATE HISTOGRAM ON c_birth_day WITH 32 BUCKETS;  
  9. +----------------+-----------+----------+--------------------------------------------------------+  
  10. | Table          | Op        | Msg_type | Msg_text                                               |  
  11. +----------------+-----------+----------+--------------------------------------------------------+  
  12. | tpcds.customer | histogram | status   | Histogram statistics created for column 'c_birth_day'. |  
  13. +----------------+-----------+----------+--------------------------------------------------------+  
  14. 1 row in set (0.10 sec)  
  15. mysql> EXPLAIN SELECT * FROM customer WHERE c_birth_day BETWEEN 1 AND 10;  
  16. +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+  
  17. | id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows  | filtered | Extra       |  
  18. +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+  
  19. |  1 | SIMPLE      | customer | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 98633 |    32.12 | Using where |  
  20. +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+  
  21. 1 row in set, 1 warning (0.00 sec) 

可以看到filtered列,從默認(rèn)的11.11%變成了更精確的32.12%。但是,如果有多個(gè)條件,有些有直方圖,有些沒有,就比較難判斷優(yōu)化器做了什么改進(jìn): 

  1. mysql> EXPLAIN SELECT * FROM customer WHERE c_birth_day <= 20 AND c_birth_year = 1967 
  2. +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+  
  3. | id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows  | filtered | Extra       |  
  4. +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+  
  5. |  1 | SIMPLE      | customer | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 98633 |     6.38 | Using where |  
  6. +----+-------------+----------+------------+------+---------------+------+---------+------+-------+----------+-------------+  
  7. 1 row in set, 1 warning (0.00 sec) 

如果想要知道更多關(guān)于直方圖統(tǒng)計(jì)的細(xì)節(jié),可以使用trace: 

  1. mysql> SET OPTIMIZER_TRACE = "enabled=on" 
  2. Query OK, 0 rows affected (0.00 sec)  
  3. mysql> SET OPTIMIZER_TRACE_MAX_MEM_SIZE = 1000000 
  4. Query OK, 0 rows affected (0.00 sec)  
  5. mysql> EXPLAIN SELECT * FROM customer WHERE c_birth_day <= 20 AND c_birth_year = 1967 
  6. mysql> SELECT JSON_EXTRACT(TRACE, "$**.filtering_effect") FROM INFORMATION_SCHEMA.OPTIMIZER_TRACE;  
  7. +----------------------------------------------------------------------------------------+  
  8. | JSON_EXTRACT(TRACE, "$**.filtering_effect")                                            |  
  9. +----------------------------------------------------------------------------------------+  
  10. | [[{"condition": "(`customer`.`c_birth_day` <= 20)", "histogram_selectivity": 0.6376}]] |  
  11. +----------------------------------------------------------------------------------------+  
  12. 1 row in set (0.00 sec) 

這里用了JSON_EXTRACT從trace里取出相關(guān)的部分。對(duì)于每個(gè)條件,直方圖被使用的話,就會(huì)看到估算過的字段的選擇性。在這個(gè)例子里,通過直方圖,對(duì)“c_birth_day <= 20”條件,估算出63.76%的數(shù)據(jù)滿足條件。事實(shí)上,與實(shí)際的數(shù)據(jù)分布情況基本一致: 

  1. mysql> SELECT  
  2. ->   (SELECT count(*) FROM customer WHERE c_birth_day <= 20)  
  3. ->   /  
  4. ->   (SELECT COUNT(*) FROM customer) AS ratio;  
  5. +--------+  
  6. | ratio  |  
  7. +--------+  
  8. | 0.6376 |  
  9. +--------+  
  10. 1 row in set (0.03 sec) 
責(zé)任編輯:龐桂玉 來源: 老葉茶館
相關(guān)推薦

2018-05-30 08:38:24

數(shù)據(jù)庫(kù)MySQL 8.0新特性

2018-06-01 15:41:21

2018-05-31 12:52:01

數(shù)據(jù)庫(kù)MySQL 8.0新特性

2021-05-19 15:06:44

MySQL數(shù)據(jù)庫(kù)命令

2017-11-01 15:50:38

數(shù)據(jù)庫(kù)MySQL 8.0新特性

2017-01-05 20:00:49

大數(shù)據(jù)技術(shù)HPE Vertica

2020-05-14 11:19:19

降序索引子集

2018-05-15 16:33:12

數(shù)據(jù)庫(kù)MySQL 8.0新特性

2019-07-19 15:53:45

MySQL 5.7MySQL 8.0MySQL

2012-08-20 11:03:42

IBMdW

2009-01-16 10:01:57

MySQL復(fù)制特性測(cè)試

2013-05-20 10:25:45

vSphere 5.1vMotion

2009-08-03 18:34:43

TuplizersNHibernate

2017-01-09 16:25:55

Android Shortcuts系統(tǒng)

2023-05-10 08:04:55

MySQL離線模式生效

2011-07-04 11:38:06

MySQL

2009-07-08 09:47:49

Scala 2.8Scala

2012-07-02 10:43:49

JVMGroovyJava

2011-05-20 09:35:22

JDK7

2024-04-24 10:31:20

PostgreSQL數(shù)據(jù)庫(kù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

亚洲欧美激情在线观看| 成人免费无码大片a毛片| 在线免费看黄网站| 国产乱子伦一区二区三区国色天香| 日韩中文字幕精品| 国产精品成人免费一区久久羞羞| 神马午夜在线视频| 国产精品久久久久久久久免费桃花| 7777精品久久久大香线蕉小说 | 国产精品天天摸av网| 亚洲自拍偷拍一区| 懂色av蜜臀av粉嫩av分享吧最新章节| 99热国内精品| 亚洲欧美国产一区二区三区 | www.日韩av| 国产精品主播视频| 欧美不卡视频在线观看| 国产三级精品在线观看| 岛国视频免费在线观看| 韩国v欧美v亚洲v日本v| 国产91成人在在线播放| 99鲁鲁精品一区二区三区| 西野翔中文久久精品字幕| 91精品国产综合久久久久久久| 国产美女网站在线观看| 直接在线观看的三级网址| 国产偷v国产偷v亚洲高清| 国产精品对白一区二区三区| 在线播放成人av| 国产一区二区精品| 欧美大学生性色视频| 亚洲精品一区二区三区在线播放| 麻豆国产欧美一区二区三区r| 欧美日韩一区二区三区不卡| 自拍日韩亚洲一区在线| av免费网站在线| 国产精品毛片高清在线完整版| 久久久久无码国产精品一区| 黄色av一区二区三区| 国产一区二区三区免费看| 国产精品久久久久久久久久久不卡 | 日韩黄色三级视频| 欧美特黄一区| 欧美精品在线免费观看| 任我爽在线视频| 特级毛片www| 蜜桃麻豆av在线| 亚洲一区二区三区四区不卡| 天天综合中文字幕| 求av网址在线观看| 国产精品久久久久久久久久久免费看| 另类欧美小说| 日韩有码电影| 91视频www| 久久精品国产美女| 色综合久久网女同蕾丝边| 99这里只有久久精品视频| 国产精品久久久久久免费观看| 国产99久久九九精品无码免费| 韩国av一区二区| 69174成人网| 免费激情视频网站| 99在线精品观看| 极品日韩久久| 欧美偷拍视频| 中文字幕第一区第二区| 日韩欧美在线观看强乱免费| 92国产在线视频| 国产精品福利一区二区| 久久最新免费视频| 污污视频在线| 欧美日韩免费看| 激情网站五月天| 成人做爰免费视频免费看| 欧美人狂配大交3d怪物一区| 亚洲色图偷拍视频| 成人av资源网址| 亚洲精品视频网上网址在线观看| 男生草女生视频| 天天做天天爱天天综合网2021| 久久视频精品在线| 国产无遮挡aaa片爽爽| 美女精品在线| 亚洲一区二区三区四区在线播放| 精品人妻一区二区三区含羞草 | 国内精品在线视频| 国产欧美一区二区三区网站| 成人免费在线看片| 瑟瑟在线观看| 亚洲欧美区自拍先锋| 18禁网站免费无遮挡无码中文| 三妻四妾的电影电视剧在线观看| 欧美性色综合网| 日本黄色www| 欧美黑人巨大videos精品| 夜夜嗨av一区二区三区四区| 极品盗摄国产盗摄合集| 亚洲色诱最新| 91社区国产高清| 天堂av网在线| 亚洲视频一区二区在线观看| 日本韩国欧美在线观看| 国产乱子精品一区二区在线观看| 精品少妇一区二区三区 | 中文字幕一区二区三区四区不卡| 免费看日本黄色| 日韩成人影音| 欧美不卡一区二区三区| 免费看黄色av| 亚洲激情偷拍| 成人av番号网| 黄色毛片在线看| 亚洲线精品一区二区三区八戒| 三级在线视频观看| 国产精品午夜av| 久久精品国产清自在天天线| 亚洲AV无码成人精品区东京热 | 精品人妻少妇嫩草av无码| 99久久综合| 日韩av快播网址| 乱精品一区字幕二区| 亚洲欧美综合在线精品| 精品人妻一区二区三区四区在线| 国产精品一区二区美女视频免费看 | 亚洲四区在线观看| 一区二区三区四区在线| 久久综合毛片| 高清电影在线观看免费| 欧美精品久久一区| 微拍福利一区二区| 久久最新视频| 精品日本一区二区三区| 午夜激情在线| 日韩一级视频免费观看在线| 成人欧美一区二区三区黑人一 | 成人免费观看在线视频| 亚洲欧美在线高清| www.涩涩涩| 精品精品99| 国产成人精品久久二区二区| 无码国产色欲xxxx视频| 亚洲电影在线播放| 成年女人免费视频| 欧美啪啪一区| 亚洲伊人一本大道中文字幕| 日本韩国在线视频爽| 欧美午夜精品久久久| 我不卡一区二区| 男人的天堂亚洲在线| 久久综合狠狠综合久久综青草| 99thz桃花论族在线播放| 精品久久人人做人人爰| 久久精品视频日本| 成人永久看片免费视频天堂| 毛片av在线播放| 精品成人自拍视频| 69av在线播放| 日韩a在线看| 91成人免费电影| 老司机精品免费视频| 美女精品自拍一二三四| 亚洲一区二区三区午夜| 欧洲精品久久久久毛片完整版| 日韩一区二区福利| 国产欧美久久久精品免费| 亚洲精品日产精品乱码不卡| 美女流白浆视频| 国产一区二区精品| 日韩.欧美.亚洲| 性欧美video另类hd尤物| 久久艳片www.17c.com| 不卡视频免费在线观看| 欧美日韩国产中文字幕| 国产毛片欧美毛片久久久| 久久精品国产一区二区三| 黄黄视频在线观看| 牛牛视频精品一区二区不卡| 国产精品jvid在线观看蜜臀 | 久久99精品久久久久久青青91| 亚洲国产精品无码久久| 精品国产乱码久久久久久天美 | 色欲av永久无码精品无码蜜桃| 欧美日韩免费看| 男人的午夜天堂| 成人午夜又粗又硬又大| 妓院一钑片免看黄大片| 亚洲第一天堂| 久久这里精品国产99丫e6| 中文成人在线| 97免费在线视频| 国产免费av在线| 日韩欧美综合一区| 成人午夜淫片100集| 欧美 日韩 综合| |精品福利一区二区三区| 91人妻一区二区| 日韩高清不卡一区二区| 乱熟女高潮一区二区在线| 久操国产精品| 91在线在线观看| 成年美女黄网站色大片不卡| 久久亚洲精品小早川怜子66| 欧洲一级在线观看| 欧美一区二区三区在线视频| 欧美a∨亚洲欧美亚洲| 亚洲视频小说图片| 人妻一区二区视频| 国产成人在线影院 | 免费毛片在线播放免费| 久久综合久久99| 男男受被啪到高潮自述| 日本aⅴ亚洲精品中文乱码| 国产精品三级一区二区| 国产日产精品_国产精品毛片| 99电影在线观看| 素人一区二区三区| 欧洲精品在线视频| 18网站在线观看| 视频在线一区二区| 欧美日韩免费做爰大片| 亚洲国产精品女人久久久| 国产精品无码在线播放| 欧美制服丝袜第一页| 国产精品免费av一区二区| 亚洲免费视频中文字幕| 久久久精品成人| 91在线国产观看| 成人在线观看一区二区| 国产在线精品国自产拍免费| 国产精品久久久久9999小说| 国产日韩欧美高清免费| 黄色大片中文字幕| 国产精品啊啊啊| 久久综合av免费| 天美一区二区三区| 久色婷婷小香蕉久久| 中文字幕在线观看第三页| 亚洲欧美日韩国产| 久久国产精品视频在线观看| 欧美精品一级| 成人污网站在线观看| 亚洲精品一二三区区别| 中文字幕久久综合| 99久久影视| 国产大尺度在线观看| 国产精品国产三级国产在线观看 | 日本在线视频1区| 精品国免费一区二区三区| 国产成人三级一区二区在线观看一| 欧美精品v日韩精品v韩国精品v| 中文字字幕在线中文乱码| 欧美在线免费视屏| 国产成人自拍偷拍| 色狠狠桃花综合| 日韩黄色片网站| 在线观看一区不卡| 在线观看免费高清视频| 欧美老女人第四色| 国产xxxx在线观看| 精品国产乱码久久久久久图片| 丰满人妻av一区二区三区| 精品国产乱码久久久久久影片| 人妻精品一区二区三区| 精品一区二区三区四区| 国内三级在线观看| 久久激情五月丁香伊人| 欧美寡妇性猛交xxx免费| 午夜精品久久久久久久99黑人| 女海盗2成人h版中文字幕| 日本欧美一二三区| 精品久久福利| 成人看片在线| 免费观看久久av| 亚洲欧洲精品在线观看| 欧美一区91| 欧美一区二区中文字幕| 日韩av一区二区在线影视| 久国产精品视频| 成人午夜免费电影| 69视频在线观看免费| 亚洲欧美偷拍另类a∨色屁股| 九九热只有精品| 一本久道久久综合中文字幕| 亚洲香蕉在线视频| 欧美变态tickle挠乳网站| 日韩av资源站| 欧美成人精品三级在线观看| 国产色播av在线| 91精品久久久久久久久不口人| 久久久久亚洲精品中文字幕| 激情五月综合色婷婷一区二区| 第一会所sis001亚洲| 国产 欧美 日韩 一区| 久久精品一本| 俄罗斯女人裸体性做爰| 久久久另类综合| www青青草原| 日韩欧美精品在线观看| 性一交一乱一伧老太| 亚洲社区在线观看| 免费影视亚洲| 国产精品欧美日韩一区二区| 91综合久久爱com| 亚洲福利av| 先锋影音久久久| 少妇高潮一69aⅹ| 国产精品女人毛片| 在线观看日韩中文字幕| 日韩一区二区免费在线电影 | 牛牛影视久久网| 日本xxxxx18| 热久久免费视频| free性中国hd国语露脸| 亚洲精品国产无套在线观| 日韩黄色片网站| 亚洲国产美女精品久久久久∴| 欧美极品另类| 日韩av电影手机在线| 成人福利免费在线观看| 亚洲AV无码成人精品一区| 玖玖玖国产精品| 性欧美丰满熟妇xxxx性久久久| 亚洲欧美视频一区| 一区二区三区播放| 亚洲天堂第一页| 综合日韩av| 国产综合18久久久久久| 国产综合色产| 欧美日韩理论片| 国产精品美女久久福利网站| 日日夜夜狠狠操| 亚洲精品乱码久久久久久金桔影视| av毛片在线播放| 成人天堂噜噜噜| 999国产精品视频| 99sesese| 中文字幕av在线一区二区三区| www.久久精品视频| 精品亚洲一区二区三区在线观看 | 欧美色综合网| 日本中文字幕有码| 亚洲欧美另类久久久精品 | 国产精品一区不卡| tube国产麻豆| 91精品国产综合久久精品麻豆| 天天综合视频在线观看| 国产精品一区av| 日韩理论片av| 三区视频在线观看| 亚洲三级在线免费观看| 国产深喉视频一区二区| 美女精品视频一区| 97久久综合精品久久久综合| 亚洲精品少妇一区二区| 国产成人精品免费一区二区| 久久精品一级片| 亚洲第一中文字幕| 是的av在线| 亚洲国产精品www| 精品一二三四在线| 婷婷在线精品视频| 精品国产一区二区亚洲人成毛片| а√在线天堂官网| 免费av一区二区三区| 视频一区二区三区在线| 国产黄色录像视频| 91精品国产91热久久久做人人| 性欧美videoshd高清| 国产乱码一区| 先锋影音久久| 亚洲少妇xxx| 日韩手机在线导航| 麻豆免费在线| 午夜精品一区二区在线观看的 | 欧美福利在线| 欧美精品欧美极品欧美激情| 日本国产一区二区| 九七久久人人| 国产精品青青草| 久久一区二区三区四区五区| 精品丰满少妇一区二区三区| 日韩一区二区高清| 自拍偷拍亚洲视频| 午夜啪啪福利视频| 成人国产精品视频| 亚洲欧美日韩一区二区三区四区| 伦理中文字幕亚洲| 你懂的在线观看一区二区| 久久撸在线视频| 亚洲国产欧美在线| 成人精品一区二区三区免费 | 欧美性受xxxx白人性爽| 日韩激情免费| 亚洲香蕉中文网| 欧美日韩成人在线一区| 大桥未久在线视频| 亚洲午夜精品久久久中文影院av| 国产a精品视频| 亚洲天堂手机在线| 97激碰免费视频|