0

このmysqlコード

SELECT  id, value, LENGTH(stuffing)
FROM  t_limit ORDER BY id LIMIT 150000, 10

このように書き直すことで、パフォーマンスを向上させるために最適化できます

注:テーブルにはIDのインデックスがあります

SELECT  l.id, value, LENGTH(stuffing)
FROM    (
    SELECT  id
    FROM    t_limit
    ORDER BY
            id
    LIMIT 150000, 10
    ) o
JOIN    t_limit l
ON      l.id = o.id
ORDER BY
    l.id

参照:http://explainextended.com/2009/10/23/mysql-order-by-limit-performance-late-row-lookups/

同様の方法でこのコードを最適化する方法

SELECT  id, value, LENGTH(stuffing)
FROM  t_limit where value>100 ORDER BY id LIMIT 150000, 10
4

2 に答える 2

0

クエリは次のように記述できます。

SELECT l.id, value, LENGTH(stuffing)
FROM (SELECT  id
      FROM t_limit
      WHERE value > 100
      ORDER BY id
      LIMIT 150000, 10
     ) o JOIN
     t_limit l
     ON l.id = o.id
ORDER BY l.id

ただし、これによってパフォーマンスが向上することはありません。MySQLは、正しい値の行を取得するためにデータページを読み取る必要があります。

これに付けることができる他のインデックスがあります:(値)、(値、id)および(id、値)。これらはパフォーマンスにさまざまな影響を及ぼします。

1つ目は、句を満たすためにインデックスを使用し、WHERE基本的にインデックスの「id」部分を無視します。value > 100選択性が高い場合(たとえば、レコードの1%未満がこの基準を満たす場合)、これによりパフォーマンスが向上します。

2番目が役立つかもしれません。正直なところ、MySQLがインデックスからIDを読み取ってから、ソートを実行するかどうかはわかりません。または、元のデータを読み取る場合。最初の場合、これは役に立ちます。

3番目が最良の選択肢かもしれません。MySQLはインデックスを読み取って一致する値を探し、そのインデックスを並べ替えと制限に使用すると思います。つまり、そうすべきですが、エンジンが実際にこれを行うかどうかは100%確信していません。

于 2012-09-27T14:04:32.177 に答える