【发布时间】:2019-08-25 15:56:38
【问题描述】:
当我只在一个表中选择查询时,我们得到了使用索引的响应,但是当在查询中使用连接语句时,mysql对表进行全扫描?
第一次查询
select *
from t_deposit_trx
where remit_tx_id = '3a33ff14-8d31-45d0-b64f-8a251c4b19a5'
1 简单的 t_deposit_trx 参考 t_deposit_trx_remit_tx_id_index
t_deposit_trx_remit_tx_id_index 110 const 1 使用索引条件
第二次查询
select tx_id
from t_settle_trx
where report_date >= '2019-03-01'
and report_date <= '2019-03-16'
and tx_type = 'CANCEL'
1 SIMPLE t_settle_trx range t_settle_trx_report_date_tx_type_index t_settle_trx_report_date_tx_type_index 196 5263 使用索引条件
2 查询运行良好。 使用索引和速度很好。
但是加入两个表,很慢。
select * from t_deposit_trx
force index (t_deposit_trx_remit_tx_id_index)
where remit_tx_id in (
select tx_id
from t_settle_trx
where report_date >= '2019-03-01'
and report_date <= '2019-03-02'
and tx_type = 'CANCEL'
)
1 主要 t_deposit_trx 全部 55724
1 PRIMARY t_settle_trx range t_settle_trx_report_date_tx_type_index t_settle_trx_report_date_tx_type_index 196 299 使用索引条件;使用哪里; FirstMatch(t_deposit_trx);使用连接缓冲区(flat, BNL join)
我们可以看到上面的结果.. t_settle_trx 使用范围扫描并获取 tx_id,接下来我希望查询使用索引 “t_settle_trx_report_date_tx_type_index” 但它使用全扫描..
我不知道为什么?
【问题讨论】:
-
使用 JOIN 比使用
IN (SELECT是否有区别。什么 MySQL/MariaDB 版本?什么是表结构(SHOW CREATE TABLE t_deposit_trx)?使 t_settle_trx_report_date_tx_type_index 在报告日期之前具有 tx_type 会很好这些查询,请查看说明中使用的长度。 -
我已经加入查询,然后两个表都使用全扫描。 mariadb 版本是 10.1.29-MariaDB-1~xenial。谢谢。
-
根据我的小经验,使用
IN比JOIN慢很多,比如INNER JOIN, LEFT JOIN or RIGHT JOIN。但我确实发现有些人体验JOIN比IN慢。 -
当您询问有关查询优化的问题时,您应该在查询中包含每个表的
SHOW CREATE TABLE。否则我们只能猜测您当前拥有的索引,以及其他表选项。例如。在这种情况下,我想知道连接是否正在比较具有不同排序规则的字符串,因此不能使用索引进行比较。 -
非常感谢比尔·卡尔文。我很欣赏你的评论。我检查了 2 个表排序规则,发现它有所不同。一个没有设置。另一个是 utf8 ..
标签: mysql indexing mariadb query-optimization