mysql – 两个连接查询需要540秒才能运行 – 我怎样才能加快速度?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 两个连接查询需要540秒才能运行 – 我怎样才能加快速度?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3961字,纯文字阅读大概需要6分钟。
内容图文
![mysql – 两个连接查询需要540秒才能运行 – 我怎样才能加快速度?](/upload/InfoBanner/zyjiaocheng/905/bddffd1c89444683a6ea2393ecf0a3fb.jpg)
特定查询需要很长时间才能运行,大约540秒(是的,9分钟!).这会导致负载峰值.
有没有办法可以重写查询 – 或添加索引 – 来加快速度?
发生了.
询问
select DISTINCT tab3.id
from `tab1`
left join `tab2` on tab2.element_id = tab1.resource_id
and tab1.resource_type = 2
and tab2.element_type_id = 1
left join `tab3` on tab2.tab3nt_id = tab3.id
where tab1.group_tab1_id = 1
and tab1.domain_id = 2
and tab3.domain_id = 2
and tab3.tab3nt_start_date >= '2012-12-01'
and tab3.tab3nt_start_date <= '2013-03-01'
解释计划
+----+-------------+-------+--------+-------------------------------------------------------------------------------------+----------------------------+---------+-------------------------------+------+-------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+-------------------------------------------------------------------------------------+----------------------------+---------+-------------------------------+------+-------------------------------------------+
| 1 | SIMPLE | tab1 | ref | group_tab1_id_resource_id,domain_id,domain_id_resource_type,tgtr_resource_domain_key | domain_id | 13 | const,const,const | 962 | Using where; Using index; Using temporary |
| 1 | SIMPLE | tab2 | ref | FK_tab3nt,element_type_id_element_id | element_type_id_element_id | 8 | const,svr.tab1.resource_id | 14 | Using where |
| 1 | SIMPLE | tab3 | eq_ref | PRIMARY,domain_id_tab3nt_type_cd | PRIMARY | 4 | svr.tab2.tab3nt_id | 1 | Using where |
+----+-------------+-------+--------+-------------------------------------------------------------------------------------+----------------------------+---------+-------------------------------+------+--------
表结构
mysql> show create table tab1\G
*************************** 1. row ***************************
Table: tab1
Create Table: CREATE TABLE `tab1` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`domain_id` int(11) NOT NULL,
`group_tab1_id` int(11) NOT NULL,
`resource_id` int(11) NOT NULL,
`resource_type` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `group_tab1_id_resource_id` (`group_tab1_id`,`resource_id`),
KEY `domain_id` (`domain_id`,`group_tab1_id`,`resource_type`,`resource_id`),
KEY `domain_id_resource_type` (`domain_id`,`resource_type`),
KEY `tgtr_resource_domain_key` (`resource_id`,`domain_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2039461 DEFAULT CHARSET=latin1
1 row in set (0.01 sec)
mysql> show create table tab2\G
*************************** 1. row ***************************
Table: tab2
Create Table: CREATE TABLE `tab2` (
`id` int(255) NOT NULL AUTO_INCREMENT,
`element_type_id` int(11) NOT NULL,
`tab3nt_id` int(11) NOT NULL,
`element_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `FK_tab3nt` (`tab3nt_id`),
KEY `element_type_id_element_id` (`element_type_id`,`element_id`)
) ENGINE=InnoDB AUTO_INCREMENT=53195543 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
mysql> show create table tab3\G
*************************** 1. row ***************************
Table: tab3
Create Table: CREATE TABLE `tab3` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`create_user_id` int(11) DEFAULT NULL,
`tab3nt_type_cd` int(11) NOT NULL,
`tab3nt_start_date` datetime NOT NULL,
`tab3nt_end_date` datetime NOT NULL,
`domain_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `tab3nt_user_FK` (`create_user_id`),
KEY `domain_id_tab3nt_type_cd` (`domain_id`,`tab3nt_type_cd`)
) ENGINE=InnoDB AUTO_INCREMENT=9393276 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
解决方法:
尝试在tab2.element_id上放置一个简单(非复合)索引.
内容总结
以上是互联网集市为您收集整理的mysql – 两个连接查询需要540秒才能运行 – 我怎样才能加快速度?全部内容,希望文章能够帮你解决mysql – 两个连接查询需要540秒才能运行 – 我怎样才能加快速度?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。