0

ローカルハブのユーザーがメッセージを保存する場所という名前のテーブルがmessagesあります(Webフォーラムのようなものです)。現在、大多数のユーザーが参加しており、毎日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;

PS

平均して7〜10秒ごとに1つのメッセージを読むという1つのリクエストを受け取ります。週末には、3秒ごとに1つ程度に上昇します。

さらに必要なことがあれば教えてください。


総括する

これは、ストアドプロシージャを呼び出して、より短い時間で最終結果を取得できる方法です。現在のクエリ(およびメソッド)は、データをフェッチして整理するのに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 に答える