0

さまざまな大きなテーブルがあるとします。例 - 3000 行のデータ。そして、フィールドが存在するすべての行を選択する必要がありますstatus < 4。関連行が 2 か月前から最大になることがわかっています (各行に日付列があるのは残念です)。

このクエリは最も効率的ですか??

SELECT * FROM database.tableName WHERE status<4 

AND DATE< '".date()-5259486."' ;

(date() - php 、5259486 - 2 か月。)...

4

2 に答える 2

1

として日付を保存していると仮定するとDATETIME、これを試すことができます:

SELECT * FROM database.tableName
WHERE status < 4
  AND DATE < DATE_SUB(NOW(), INTERVAL 2 MONTHS)

また、検索クエリを最適化するには、次のように使用できますEXPLAIN( http://dev.mysql.com/doc/refman/5.6/en/explain.html ):

EXPLAIN [your SELECT statement]

応答時間を微調整できるもう 1 つのポイントは、適切なインデックスを慎重に配置することです。

インデックスは、特定の列の値を持つ行をすばやく見つけるために使用されます。インデックスがない場合、MySQL は最初の行から始めて、テーブル全体を読み取って関連する行を見つける必要があります。テーブルが大きいほど、このコストは高くなります。テーブルに問題の列のインデックスがある場合、MySQL は、すべてのデータを調べる必要なく、データ ファイルの途中でシークする位置をすばやく判断できます。

以下は、MySQL インデックスに関する説明とチュートリアルです。

ただし、DATETIME の代わりに TIMESTAMP を使用する方が効率的であることに注意してください。前者は 4 バイトです。後者は 8 です。これらは同等の情報を保持します (タイムゾーンの問題を除く)。

于 2013-08-19T12:52:03.127 に答える
0

データベースの場合、3,000 行のデータは大きくありません。実際、それは小さい側にあります。

クエリ:

 SELECT *
 FROM database.tableName
 WHERE status < 4 ;

各行が非常に大きい場合 (たとえば 10k) でない限り、3,000 行でかなり高速に実行する必要があります。いつでもインデックスを付けstatusて、実行を高速化できます。

cassi.iup によって提案されたクエリは、より理にかなっています。

SELECT *
FROM database.tableName
WHERE status < 4 AND DATE < DATE_SUB(NOW(), INTERVAL 2 MONTHS);

の複合インデックスを使用すると、パフォーマンスが向上しstatus, dateます。私の質問は、ステータスが 4 のすべての行が必要ですか、それとも過去 2 か月のステータスが 4 のすべての行が必要ですか? 最初のケースでは、クエリを継続的に変更する必要があります。あなたはより良いでしょう:

SELECT *
FROM database.tableName
WHERE status < 4 AND DATE < date('2013-06-19');

(これを書いている時点で。)

于 2013-08-19T13:08:45.187 に答える