在MySQL的一些优化straight_join技术
在Oracle中有许多指定表连接:命令提示提示Oracle根据指令后,从关键词表按顺序连接;领先的暗示表明,查询优化器使用指定的表作为第一个连接表,即驱动表;use_nl暗示表明,查询优化器使用嵌套循环连接到指定的表其他来源。并将指定的表作为内部表强制执行。在MySQL数据库中,有一个相应的straight_join。因为MySQL只支持嵌套循环连接的方式,straight_join这里类似于use_nl暗示在Oracle,MySQL的优化器在处理多表关联,可能选错了表驱动协会,使协会的数量增加,使得SQL语句执行变得非常慢,这个时候需要有经验的DBA来判断,选择正确的驾驶台,这一次straight_join将在这里发挥作用,我们看看straight_join使用优化案例:
1。用户实例:一个spxxxxxx SQL执行速度非常慢,SQL如下:
73871根127.0.0.1:49665 user_app_test | | | |查询| 500 |排序结果|
选择日期(practicetime)date_time,计数(不同的a.userid)people_rows
从test_log,用户B
在a.userid = b.userid和b.isfree = 0和长度(b.username)> 4
集团通过日期(practicetime)
2。查看执行计划:
MySQL >解释选择日期(practicetime)date_time,计数(不同的a.userid)people_rows
从test_log,用户B
在a.userid = b.userid和b.isfree = 0和长度(b.username)> 4
集团通过日期(practicetime);
MySQL >解释选择日期(practicetime)date_time,计数(不同的a.userid)people_rows
从用户B -> test_log。
在那里,b.isfree = 0和长> a.userid = b.userid(b.username)> 4
组->日期(practicetime) G;
*************************** 1。行***************************
编号:1
select_type:简单
表:一
类型:所有
possible_keys:ix_test_log_userid
关键词:零
key_len:空
参考:空
行数:416782
另外:使用filesort
*************************** 2。行***************************
编号:1
select_type:简单
表:B
类型:eq_ref
possible_keys:初级
关键词:小学
key_len:96
参考:user_app_testnew.a.userid
行数:1
附加:使用在哪里
2行(0秒)
三.查看索引:
MySQL >显示指数从test_log;
+ + + - + + + + + +
表non_unique key_name | | | | seq_in_index column_name整理基数| | | | sub_part |填充空index_type评论| | | |
+ + + - + + + + + +
| test_log | 0 | ix_test_log_unique_ | 1 | unitid |一| 20 |空|空| | btree | |
| test_log | 0 | ix_test_log_unique_ | 2 | paperid |一| 20 |空|空| | btree | |
| test_log | 0 | ix_test_log_unique_ | 3 | qtid |一| 20 |空|空| | btree | |
| test_log | 0 | ix_test_log_unique_ | 4 | userid |一| 400670 |空|空| | btree | |
| test_log | 0 | ix_test_log_unique_ | 5 |串行|一| 400670 |空|空| | btree | |
| test_log | 1 | ix_test_log_unit | 1 | unitid |一| 519 |空|空| | btree | |
| test_log | 1 | ix_test_log_unit | 2 | paperid |一| 2023 |空|空| | btree | |
| test_log | 1 | ix_test_log_unit | 3 | qtid |一| 16694 |空|空| | btree | |
| test_log | 1 | ix_test_log_serial | 1 |串行|一| 133556 |空|空| | btree | |
| test_log | 1 | ix_test_log_userid | 1 | userid |一| 5892 |空|空| | btree | |
+ + +…
4。调整索引,表优化覆盖指数。
MySQL >修改表test_log下降指数ix_test_log_userid,添加索引ix_test_log_userid(用户名,practicetime)
5。查看执行计划:
MySQL >解释选择日期(practicetime)date_time,计数(不同的a.userid)people_rows
从test_log,用户B
在a.userid = b.userid和b.isfree = 0和长度(b.username)> 4
集团通过日期(practicetime) G
*************************** 1。行***************************
编号:1
select_type:简单
表:一
类型:指数
possible_keys:ix_test_log_userid
关键词:ix_test_log_userid
key_len:105
参考:空
行数:388451
额外的:使用索引;使用filesort
*************************** 2。行***************************
编号:1
select_type:简单
表:B
类型:eq_ref
possible_keys:初级
关键词:小学
key_len:96
参考:user_app_test.a.userid
行数:1
附加:使用在哪里
2行(0秒)
调整后,实现稍微有效,但不明显,找不到钥匙。
选择日期(practicetime)date_time,计数(不同的a.userid)people_rows
从test_log,用户B
在a.userid = b.userid和b.isfree = 0和长度(b.username)> 4
集团通过日期(practicetime);
的…
143行(1分钟12.62秒)
6、执行时间还需要很长的时间,和时间消耗在使用filesort主要消耗。参与排序的数据量是38W,因此有必要将驱动表;尽量使用用户表驱动表:使用straight_join迫使连接顺序。
MySQL >解释选择日期(practicetime)date_time,计数(不同的a.userid)people_rows
从用户B straight_join test_log一
在a.userid = b.userid和b.isfree = 0和长度(b.username)> 4
集团通过日期(practicetime) G;
*************************** 1。行***************************
编号:1
select_type:简单
表:B
类型:所有
possible_keys:初级
关键词:零
key_len:空
参考:空
行数:42806
额外的:使用;使用临时用filesort;
*************************** 2。行***************************
编号:1
select_type:简单
表:一
类型:裁判
possible_keys:ix_test_log_userid
关键词:ix_test_log_userid
key_len:96
参考:user_app_test.b.userid
行数:38
附加:使用索引
2行(0秒)
执行时间已被定性地更改为2.56秒。
MySQL >选择日期(practicetime)date_time,计数(不同的a.userid)people_rows
从用户B straight_join test_log一
在a.userid = b.userid和b.isfree = 0和长度(b.username)> 4
集团通过日期(practicetime);
.......
143行(2.56秒)
7,在分析执行计划,第一步使用的地方,使用临时表,使用filesort和用户也可以使用覆盖索引,避免出现使用的地方,所以继续调整指数。
从用户显示索引;
++—++—++
表non_unique key_name | | | | seq_in_index column_name整理基数| | | | sub_part |填充空index_type评论| | | |
++—++—++
|用户| 0 |初级| 1 | userid |一| 43412 |空|空| | btree | |
|用户| 0 | ix_user_email | 1 |电子邮件|一| 43412 |空|空| | btree | |
|用户| 1 | ix_user_username | 1 |用户名|一| 202 |空|空| | btree | |
++—++—++
3行(0.01秒)
MySQL >删除用户表的索引ix_user_username,添加索引ix_user_username(用户名是免费的);
查询OK,42722行受影响(0.73秒)
记录:42722个重复:0个警告:0
MySQL >解释选择日期(practicetime)date_time,计数(不同的a.userid)people_rows
从用户B straight_join test_log一
在a.userid = b.userid和b.isfree = 0和长度(b.username)> 4
集团通过日期(practicetime);
*************************** 1。行***************************
编号:1
select_type:简单
表:B
类型:指数
possible_keys:初级
关键词:ix_user_username
key_len:125
参考:空
行数:42466
额外的:使用;使用索引;使用临时用filesort;
*************************** 2。行***************************
编号:1
select_type:简单
表:一
类型:裁判
possible_keys:ix_test_log_userid
关键词:ix_test_log_userid
key_len:96
参考:user_app_test.b.userid
行数:38
附加:使用索引
2行(0秒)
8。执行时间减少到1.43秒。
MySQL >选择日期(practicetime)date_time,计数(不同的a.userid)people_rows
从用户B straight_join test_log一
在a.userid = b.userid和b.isfree = 0和长度(b.username)> 4
集团通过日期(practicetime);
对.
143行(1.43秒)