当你在建立直方图的时候,MySQL server会将所有数据读到内存中,然后在内存中进行操作,包括排序。如果对一个很大的表建立直方图,可能会有风险将几百M的数据都读到内存中,但这是不明智的。为了规避这个风险,MySQL会根据给定的histogram_generation_max_mem_size的值计算该将多少行数据读到内存中。如果根据当前histogram_generation_max_mem_size的限制,MySQL认为只能读一部分数据,那么MySQL会进行取样。通过“sampling-rate”属性,可以观察到取样比率。
- mysql> SET histogram_generation_max_mem_size = 1000000;
- Query OK, 0 rows affected (0.00 sec)
- mysql> ANALYZE TABLE customer UPDATE HISTOGRAM ON c_birth_country WITH 16 BUCKETS;
- +----------------+-----------+----------+------------------------------------------------------------+
- | Table | Op | Msg_type | Msg_text |
- +----------------+-----------+----------+------------------------------------------------------------+
- | tpcds.customer | histogram | status | Histogram statistics created for column 'c_birth_country'. |
- +----------------+-----------+----------+------------------------------------------------------------+
- 1 row in set (0.22 sec)
- mysql> SELECT histogram->>'$."sampling-rate"'
- -> FROM information_schema.column_statistics
- -> WHERE table_name = "customer"
- -> AND column_name = "c_birth_country";
- +---------------------------------+
- | histogram->>'$."sampling-rate"' |
- +---------------------------------+
- | 0.048743243211626014 |
- +---------------------------------+
- 1 row in set (0.00 sec)
(编辑:晋中站长网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|