Mysql “如何有效写作”;从t中选择a,其中b按a的顺序排列;查询

Mysql “如何有效写作”;从t中选择a,其中b按a的顺序排列;查询,mysql,sql,database,Mysql,Sql,Database,考虑到我的需求,我有一个简单的查询太慢了。查询是: SELECT a FROM tableA WHERE b IN ("SOME_IDS_LIST") ORDER BY a 表a大约有300000行,包含索引(a,b)。“SOME_id_LIST”列表越长,查询速度越慢。有没有办法加速这种查询?我在互联网上寻找一些通用的解决方案,但运气不好。在你的表格中的b字段上放一个索引 如果结果太慢 取而代之的是使用IN子句,使用您的ID创建一个临时表,并使用内部JOIN语句将您的临时表链接到您的tabl

考虑到我的需求,我有一个简单的查询太慢了。查询是:

SELECT a FROM tableA WHERE b IN ("SOME_IDS_LIST") ORDER BY a

表a大约有300000行,包含索引(a,b)。“SOME_id_LIST”列表越长,查询速度越慢。有没有办法加速这种查询?我在互联网上寻找一些通用的解决方案,但运气不好。

在你的表格中的b字段上放一个索引

如果结果太慢

取而代之的是使用IN子句,使用您的ID创建一个临时表,并使用内部JOIN语句将您的临时表链接到您的tableA

您的脚本:

CREATE TEMPORARY TABLE myTempTable (id int)
INSERT INTO myTempTable (all your ID)

SELECT *
FROM tableA
JOIN myTempTable
ON tableA.b = myTempTable.id

关于创建临时表

有必要测试EXISTS子句。与IN子句相比,这些通常可以显著提高性能。这同样需要一个临时表

CREATE TEMPORARY TABLE myTempTable (id int)
INSERT INTO myTempTable (all your ID)

SELECT  TA.a 
FROM    tableA TA
WHERE   EXISTS 
        (SELECT *
        FROM    myTempTable TT
        WHERE   TT.id = TA.b
        )
ORDER BY
        TA.a

你需要通过
b
@HamletHakobyan只通过a进行索引吗?为什么(a,b)不允许DB使用覆盖索引?您可能需要查看索引中的列顺序。看这个问题如果B是WHERE子句中你经常看到的列,它应该是索引中的第一列。把索引放在(B,a)上代替(或添加到)。好的,但问题是我必须使用a的顺序。我不认为它能解决这个问题。@FlexJack:你在“b”上尝试索引了吗?@MikeSherrill'Catcall'-是的,由于ORDER BY子句的存在,它实际上使查询更慢了。DB需要检查所有结果并对其进行排序。行数越多越糟。@JoeTaras好的,谢谢。我要试一试。我需要稍微修改一下我的代码来实现它。我会让你知道它是如何工作的。好的,谢谢。我要试一试。我需要稍微修改一下我的代码来实现它。我会让你知道它是如何工作的。