0

我有一个名为messages我本地集线器的用户存储他们的消息的表(有点像网络论坛)。目前,大多数用户都参与其中,我每天都会收到近 30 到 50 个新条目。

由于这已经持续了几年,我们已经在表中获得了近 100,000 行数据。表结构有点像这样。and和(昵称)fid在哪里。PRIMARYipidINDEX

我直到现在都在使用这种查询;然后在luasql 中迭代结果集,如此链接所示。据我说,这会消耗大量时间和空间(在缓冲区中)。

`msg` VARCHAR(280) NOT NULL,
`id` VARCHAR(30) NOT NULL,
`ctg` VARCHAR(10) NOT NULL,
`date` DATE NOT NULL COMMENT 'date_format( %m/%d/%y )',
`time` TIME NOT NULL COMMENT 'date_format( %H:%i:%s )',
`fid` BIGINT(20) NOT NULL AUTO_INCREMENT,
`ip` CHAR(39) NOT NULL DEFAULT '127.0.0.1'

我的问题是,现在,我们已经切换到PtokaX的新 API,读写请求的数量急剧增加。因为,我最近阅读了 MySQL 程序,我在想这些程序是否是处理这种情况的更快 更安全的方法。

SELECT *
FROM ( SELECT *
    FROM `messages`
    ORDER BY `fid` DESC
    LIMIT 50 ) AS `temp`
ORDER BY `fid` ASC;

附言

我们平均每 7 到 10 秒就会收到一个阅读一条消息的请求。在周末,它会上升到大约每 3 秒一次。

如果需要更多信息,请告诉我。


总结一下

他们是我可以调用存储过程并在更短的时间内获得最终结果的一种方式。当前查询(和方法)需要将近 3 秒来获取和组织数据。

4

1 回答 1

0

关于您的查询的几件事:

SELECT *
FROM ( SELECT *
    FROM `messages`
    ORDER BY `fid` DESC
    LIMIT 50 ) AS `temp`
ORDER BY `fid` ASC;
  1. 从不SELECT *(全部);总是指定一个列列表(你需要什么)
  2. 子查询通常成本更高(用于排序和存储)
  3. 如果您尝试获取底部的“50”,请尝试使用BETWEEN子句

您始终可以使用EXPLAIN. 我会尝试以下查询:

SELECT `msg`, `id`, `ctg`, `date`, `time`, `fid`, `ip` FROM `messages` 
WHERE `fid` > (SELECT MAX(`fid`)-50 FROM `messages`)
ORDER BY `fid` 
于 2012-09-08T20:34:01.213 回答