暂无图片
如何优化这个查询mysql 8
我来答
分享
Switchblade
2023-11-28
如何优化这个查询mysql 8
暂无图片 50M

1.查询语句

SELECT menu_id, item_id, SUM(status) >= 0 "status" FROM item_activation_in_menu activation WHERE menu_id IN ('2d6e4dbc-9ccf-49cd-a924-ba5b646fc07d', 'f8042ee6-0de3-497c-8842-fc2699405fc5', 'fd436116-3b59-44aa-be74-115b4175b971', '7335cd44-c32a-40eb-88d3-e36e8efb24e2', '0d5fbd56-64a2-4d2b-b533-629f09afdd2b', '2ebf6f40-7e08-4888-93ce-499e241a9d85') GROUP BY menu_id, item_id;

现在的索引(menu_id, item_id,status).

表有765万行,count(distinct menu_id)的值是16,从trace中发现是走了全表扫描。使用hint skip_scan无效。下面是trace信息。

mysql> select trace from `information_schema`.`optimizer_trace`\G
*************************** 1. row ***************************
trace: {
"steps": [
{
"join_preparation": {
"select#": 1,
"steps": [
{
"IN_uses_bisection": true
},
{
"expanded_query": "/* select#1 */ select `item_activation_in_menu`.`menu_id` AS `menu_id`,`item_activation_in_menu`.`item_id` AS `item_id`,(sum(`item_activation_in_menu`.`status`) >= 0) AS `status` from `item_activation_in_menu` where (`item_activation_in_menu`.`menu_id` in ('2d6e4dbc-9ccf-49cd-a924-ba5b646fc07d','f8042ee6-0de3-497c-8842-fc2699405fc5','fd436116-3b59-44aa-be74-115b4175b971','7335cd44-c32a-40eb-88d3-e36e8efb24e2','0d5fbd56-64a2-4d2b-b533-629f09afdd2b','2ebf6f40-7e08-4888-93ce-499e241a9d85')) group by `item_activation_in_menu`.`menu_id`,`item_activation_in_menu`.`item_id`"
}
]
}
},
{
"join_optimization": {
"select#": 1,
"steps": [
{
"condition_processing": {
"condition": "WHERE",
"original_condition": "(`item_activation_in_menu`.`menu_id` in ('2d6e4dbc-9ccf-49cd-a924-ba5b646fc07d','f8042ee6-0de3-497c-8842-fc2699405fc5','fd436116-3b59-44aa-be74-115b4175b971','7335cd44-c32a-40eb-88d3-e36e8efb24e2','0d5fbd56-64a2-4d2b-b533-629f09afdd2b','2ebf6f40-7e08-4888-93ce-499e241a9d85'))",
"steps": [
{
"transformation": "equality_propagation",
"resulting_condition": "(`item_activation_in_menu`.`menu_id` in ('2d6e4dbc-9ccf-49cd-a924-ba5b646fc07d','f8042ee6-0de3-497c-8842-fc2699405fc5','fd436116-3b59-44aa-be74-115b4175b971','7335cd44-c32a-40eb-88d3-e36e8efb24e2','0d5fbd56-64a2-4d2b-b533-629f09afdd2b','2ebf6f40-7e08-4888-93ce-499e241a9d85'))"
},
{
"transformation": "constant_propagation",
"resulting_condition": "(`item_activation_in_menu`.`menu_id` in ('2d6e4dbc-9ccf-49cd-a924-ba5b646fc07d','f8042ee6-0de3-497c-8842-fc2699405fc5','fd436116-3b59-44aa-be74-115b4175b971','7335cd44-c32a-40eb-88d3-e36e8efb24e2','0d5fbd56-64a2-4d2b-b533-629f09afdd2b','2ebf6f40-7e08-4888-93ce-499e241a9d85'))"
},
{
"transformation": "trivial_condition_removal",
"resulting_condition": "(`item_activation_in_menu`.`menu_id` in ('2d6e4dbc-9ccf-49cd-a924-ba5b646fc07d','f8042ee6-0de3-497c-8842-fc2699405fc5','fd436116-3b59-44aa-be74-115b4175b971','7335cd44-c32a-40eb-88d3-e36e8efb24e2','0d5fbd56-64a2-4d2b-b533-629f09afdd2b','2ebf6f40-7e08-4888-93ce-499e241a9d85'))"
}
]
}
},
{
"substitute_generated_columns": {
}
},
{
"table_dependencies": [
{
"table": "`item_activation_in_menu`",
"row_may_be_null": false,
"map_bit": 0,
"depends_on_map_bits": [
]
}
]
},
{
"ref_optimizer_key_uses": [
]
},
{
"rows_estimation": [
{
"table": "`item_activation_in_menu`",
"range_analysis": {
"table_scan": {
"rows": 7690706,
"cost": 830416
},
"potential_range_indexes": [
{
"index": "PRIMARY",
"usable": false,
"cause": "not_applicable"
},
{
"index": "item_act_item_id_fk",
"usable": false,
"cause": "not_applicable"
},
{
"index": "menu_id",
"usable": true,
"key_parts": [
"menu_id",
"id"
]
},
{
"index": "idx_mid_iid_st",
"usable": true,
"key_parts": [
"menu_id",
"item_id",
"status",
"id"
]
}
],
"best_covering_index_scan": {
"index": "idx_mid_iid_st",
"cost": 2.64865e+06,
"chosen": false,
"cause": "cost"
},
"setup_range_conditions": [
],
"group_index_range": {
"chosen": false,
"cause": "not_applicable_aggregate_function"
},
"skip_scan_range": {
"chosen": false,
"cause": "has_group_by"
},
"analyzing_range_alternatives": {
"range_scan_alternatives": [
{
"index": "menu_id",
"ranges": [
"0d5fbd56-64a2-4d2b-b533-629f09afdd2b <= menu_id <= 0d5fbd56-64a2-4d2b-b533-629f09afdd2b",
"2d6e4dbc-9ccf-49cd-a924-ba5b646fc07d <= menu_id <= 2d6e4dbc-9ccf-49cd-a924-ba5b646fc07d",
"2ebf6f40-7e08-4888-93ce-499e241a9d85 <= menu_id <= 2ebf6f40-7e08-4888-93ce-499e241a9d85",
"7335cd44-c32a-40eb-88d3-e36e8efb24e2 <= menu_id <= 7335cd44-c32a-40eb-88d3-e36e8efb24e2",
"f8042ee6-0de3-497c-8842-fc2699405fc5 <= menu_id <= f8042ee6-0de3-497c-8842-fc2699405fc5",
"fd436116-3b59-44aa-be74-115b4175b971 <= menu_id <= fd436116-3b59-44aa-be74-115b4175b971"
],
"index_dives_for_eq_ranges": true,
"rowid_ordered": false,
"using_mrr": false,
"index_only": false,
"rows": 4467039,
"cost": 4.90682e+06,
"chosen": false,
"cause": "cost"
},
{
"index": "idx_mid_iid_st",
"ranges": [
"0d5fbd56-64a2-4d2b-b533-629f09afdd2b <= menu_id <= 0d5fbd56-64a2-4d2b-b533-629f09afdd2b",
"2d6e4dbc-9ccf-49cd-a924-ba5b646fc07d <= menu_id <= 2d6e4dbc-9ccf-49cd-a924-ba5b646fc07d",
"2ebf6f40-7e08-4888-93ce-499e241a9d85 <= menu_id <= 2ebf6f40-7e08-4888-93ce-499e241a9d85",
"7335cd44-c32a-40eb-88d3-e36e8efb24e2 <= menu_id <= 7335cd44-c32a-40eb-88d3-e36e8efb24e2",
"f8042ee6-0de3-497c-8842-fc2699405fc5 <= menu_id <= f8042ee6-0de3-497c-8842-fc2699405fc5",
"fd436116-3b59-44aa-be74-115b4175b971 <= menu_id <= fd436116-3b59-44aa-be74-115b4175b971"
],
"index_dives_for_eq_ranges": true,
"rowid_ordered": false,
"using_mrr": false,
"index_only": true,
"rows": 4488053,
"cost": 1.54567e+06,
"chosen": false,
"cause": "cost"
}
],
"analyzing_roworder_intersect": {
"usable": false,
"cause": "too_few_roworder_scans"
}
}
}
}
]
},
{
"considered_execution_plans": [
{
"plan_prefix": [
],
"table": "`item_activation_in_menu`",
"best_access_path": {
"considered_access_paths": [
{
"rows_to_scan": 7690706,
"access_type": "scan",
"resulting_rows": 7.69071e+06,
"cost": 830414,
"chosen": true,
"use_tmp_table": true
}
]
},
"condition_filtering_pct": 100,
"rows_for_plan": 7.69071e+06,
"cost_for_plan": 830414,
"sort_cost": 7.69071e+06,
"new_cost_for_plan": 8.52112e+06,
"chosen": true
}
]
},
{
"attaching_conditions_to_tables": {
"original_condition": "(`item_activation_in_menu`.`menu_id` in ('2d6e4dbc-9ccf-49cd-a924-ba5b646fc07d','f8042ee6-0de3-497c-8842-fc2699405fc5','fd436116-3b59-44aa-be74-115b4175b971','7335cd44-c32a-40eb-88d3-e36e8efb24e2','0d5fbd56-64a2-4d2b-b533-629f09afdd2b','2ebf6f40-7e08-4888-93ce-499e241a9d85'))",
"attached_conditions_computation": [
],
"attached_conditions_summary": [
{
"table": "`item_activation_in_menu`",
"attached": "(`item_activation_in_menu`.`menu_id` in ('2d6e4dbc-9ccf-49cd-a924-ba5b646fc07d','f8042ee6-0de3-497c-8842-fc2699405fc5','fd436116-3b59-44aa-be74-115b4175b971','7335cd44-c32a-40eb-88d3-e36e8efb24e2','0d5fbd56-64a2-4d2b-b533-629f09afdd2b','2ebf6f40-7e08-4888-93ce-499e241a9d85'))"
}
]
}
},
{
"optimizing_distinct_group_by_order_by": {
"simplifying_group_by": {
"original_clause": "`item_activation_in_menu`.`menu_id`,`item_activation_in_menu`.`item_id`",
"items": [
{
"item": "`item_activation_in_menu`.`menu_id`"
},
{
"item": "`item_activation_in_menu`.`item_id`"
}
],
"resulting_clause_is_simple": true,
"resulting_clause": "`item_activation_in_menu`.`menu_id`,`item_activation_in_menu`.`item_id`"
}
}
},
{
"reconsidering_access_paths_for_index_ordering": {
"clause": "GROUP BY",
"steps": [
],
"index_order_summary": {
"table": "`item_activation_in_menu`",
"index_provides_order": true,
"order_direction": "asc",
"index": "idx_mid_iid_st",
"plan_changed": false
}
}
},
{
"finalizing_table_conditions": [
{
"table": "`item_activation_in_menu`",
"original_table_condition": "(`item_activation_in_menu`.`menu_id` in ('2d6e4dbc-9ccf-49cd-a924-ba5b646fc07d','f8042ee6-0de3-497c-8842-fc2699405fc5','fd436116-3b59-44aa-be74-115b4175b971','7335cd44-c32a-40eb-88d3-e36e8efb24e2','0d5fbd56-64a2-4d2b-b533-629f09afdd2b','2ebf6f40-7e08-4888-93ce-499e241a9d85'))",
"final_table_condition ": "(`item_activation_in_menu`.`menu_id` in ('2d6e4dbc-9ccf-49cd-a924-ba5b646fc07d','f8042ee6-0de3-497c-8842-fc2699405fc5','fd436116-3b59-44aa-be74-115b4175b971','7335cd44-c32a-40eb-88d3-e36e8efb24e2','0d5fbd56-64a2-4d2b-b533-629f09afdd2b','2ebf6f40-7e08-4888-93ce-499e241a9d85'))"
}
]
},
{
"refine_plan": [
{
"table": "`item_activation_in_menu`"
}
]
},
{
"considering_tmp_tables": [
]
}
]
}
},
{
"join_execution": {
"select#": 1,
"steps": [
]
}
}
]
}
1 row in set (0.01 sec)

我来答
添加附件
收藏
分享
问题补充
4条回答
默认
最新
chengang

你这个status可以 = -1 不好处理了

如果status 是0,1的话。这个语句可以用松散扫描来优化。

SELECT menu_id, item_id, MAX(status) >= 0 "status" FROM item_activation_in_menu activation WHERE menu_id IN ('2d6e4dbc-9ccf-49cd-a924-ba5b646fc07d', 'f8042ee6-0de3-497c-8842-fc2699405fc5', 'fd436116-3b59-44aa-be74-115b4175b971', '7335cd44-c32a-40eb-88d3-e36e8efb24e2', '0d5fbd56-64a2-4d2b-b533-629f09afdd2b', '2ebf6f40-7e08-4888-93ce-499e241a9d85') GROUP BY menu_id, item_id;
复制

你试一下这个。执行应该很快。会看到 松散描的标志
the EXPLAIN output shows Using index for group-by in the Extra column.

暂无图片 评论
暂无图片 有用 1
打赏 0
暂无图片
八云

最好的办法 删掉

暂无图片 评论
暂无图片 有用 0
打赏 0
chengang

贴一个执行计划呢?
count(distinct item_id) 大概是一个什么数据
status 的取值有些什么呢?

如果status 取值是固定的 0,1,2,3等值。那有很好的优化手法。

暂无图片 评论
暂无图片 有用 1
打赏 0
Switchblade
题主
2023-11-28
你好,我贴成附件的形式了,请帮忙看看,谢谢
Switchblade
暂无图片 评论
暂无图片 有用 0
打赏 0
回答交流
Markdown


请输入正文
提交
相关推荐
mysql 同一行的两列如何报证值不相同
回答 1
已知的话是没有的。这是应该设计上控制。你这等于是比如浙江杭州金华温州湖州这样的,你不希望湖州下面出现浙江是吧?这个数据库上做不了。
rpm包安装mysql8.0,配置文件不是/etc/my.cnf,怎么修改配置?
回答 1
在/etc/my.cnf里面先配置一下mysql相关的配置项安装mysql8.0的rpm包将my.cnf文件移动到你想要的位置启动mysql服务mysqld&nbsp;mysqlddefaultsfi
MySQL的5.7和5.5的主从复制,读写分离 、分库分表配置一样吗?
回答 1
这个问题太模糊。1.主从复制传统的position方式一样,但记录的binlog肯定有差异。2.读写分析,分库分表:比如前段使用mycat之类的都一样。
MySQL数据库创建索引的注意事项是什么?
回答 1
已采纳
索引的注意事项主要包括以下几点:1)不在低基数列上创建索引。2)不在索引列进行数学运算和函数运算,因为对索引字段执行函数操作可能会导致无法使用索引。3)索引不宜过多,单表索引过多不仅占空间,还会影响数
MySQL 如何从 DUMP 备份的SQL 里获取某个表的数据?
回答 7
从备份文件中直接筛选,也是一个简单便捷的方法
求问,大家有比较规范的mysql数据库巡检报告模板吗?该巡检哪些项等等
回答 1
同求!
MySQL的mysql_upgrade
回答 2
已采纳
参考:https://dev.mysql.com/doc/refman/8.0/en/mysqlupgrade.html
华为云裸金属 部署11g RAC,共享盘为一块独立的高性能磁盘,划分三个分区用于ASM(OCR/DATA/FRA),请问是否可行?
回答 1
为什么不弄3块盘呢?如果磁盘不够用的话,我觉得adg也是个不错的选择
MySQL为什么在单表数据量达到千万/亿级别时性能比百万级别时差很多?
回答 1
已采纳
按照Btree的原理,你只要用索引1千万和10亿的层级一样高。如果性能差很多,看看执行计划是不是全表了。
mysql表中从没有任何主键到添加主键的过程是如何的?
回答 3
mysql是索引组织表,整个表的组织形式是按主键的顺序排列的,无主键表添加主键是需要发生表的重组