MySql MAX查询优化

标签 mysql sql performance aggregate-functions

鉴于这种情况,我有两个具有以下现有索引的表:

CREATE TABLE tblBusses 
(
    intID BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    strBus VARCHAR(100) NOT NULL DEFAULT ""
);
CREATE INDEX indBussesBus ON tblBusses (strBus );
CREATE INDEX indBussesID ON tblBusses (intID);

CREATE TABLE tblPersons
(
    intID BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    strPerson VARCHAR(100) NOT NULL DEFAULT "",
    intBusID BIGINT UNSIGNED NOT NULL,
    intSexID BIGINT UNSIGNED NOT NULL,
    datCreated TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX indPersonsPerson ON tblPersons (strPerson );
CREATE INDEX indPersonsSex ON tblPersons (intBusID);

...而 tblPersons(intBusID) 是引用 tblBusses(intID) 的外键,而 tblPersons(intSexID) 是指向不同的明显表的外键。在这种情况下,tblPersons 包含5000 万+ 记录,而 tblBusses 包含大约 100 万 记录。

persons 表正在逐步填充(使用 cronjob),我需要从 tblBusses 中获取下一个 100 辆总线,这些总线尚未在 tblPersons 中引用并具有选定的性别,执行一些填充(插入)查询。考虑到这些数字,这是一个小挑战。填充查询足够快,但预总线选择查询是一个挑战,而且速度太慢。

目前,为了选择接下来的 100 条总线,我假设我用递增的总线 ID 填充 tblPersons,所以我搜索 MAX(tblPersons.intBusID),然后我得到接下来的 100 条 tblBusses 记录:

SELECT max(intBusID) AS intMaxBus 
FROM tblPersons 
WHERE intSexID={$intSexID};

SELECT intID, strBus 
FROM tblBusses 
WHERE intID>{$intMaxBus} 
ORDER BY intID ASC 
LIMIT 100;

第二个查询需要 1900 微秒(足够快)。第一个需要 2.5 秒,太慢了。当然在可预见的 future 。

我怎样才能让它更快?我不在乎是否有人想出了更好的方法来解决我的整个问题(我们都是学习者),或者改进了 MAX() 查询的解决方案,2.5 秒太慢了。

我能想到的一个解决方案是让 mysql 以某种方式连续缓存 max(intBusID) 位置。我原以为索引无论如何都会发生这种情况,但显然在 2.5 秒内,效果还不够好。有什么提示吗?

最佳答案

这是 max() 查询:

SELECT max(intBusID) AS intMaxBus 
FROM tblPersons 
WHERE intSexID={$intSexID}

您需要在 tblPersons(intSexID, intBusID) 上建立索引;

您可以将查询组合为:

SELECT intID, strBus 
FROM tblBusses 
WHERE intID > (SELECT coalesce(max(intBusID) , 0) AS intMaxBus 
               FROM tblPersons 
               WHERE intSexID = {$intSexID}
              )
ORDER BY intID ASC 
LIMIT 100;

此查询将受益于 tblBusses(intID, strBus) 上的索引。

关于MySql MAX查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21519296/

相关文章:

mysql - 选择查询MySql

MYSQL5.5 INNODB优化

mysql - 合并两个具有不同结构的表的结果

.net - 什么可能导致进行 HttpWebRequest 调用的巨大开销?

mysql - 如何使我的查询正常工作(查询多个表)

mysql - 如何重新排列 MySQL 列?

java - 在 Java 中处理难看的 SQL

mysql - Oracle中如何转换日期?

javascript - 添加 CSS 类和子级数量的性能

c++ - std deque 出奇地慢