1

私はMySQLデータベースを持っています:

CREATE TABLE IF NOT EXISTS `tableexample` (
    `id` int(11) NOT NULL auto_increment,
    `val0` tinyint(1) NOT NULL,
    `val1` tinyint(1) NOT NULL,
    `val2` tinyint(1) NOT NULL,
    `val3` tinyint(1) NOT NULL,
    `val4` tinyint(1) NOT NULL,
    `val5` tinyint(1) NOT NULL,
    .................
    `val1996` tinyint(1) NOT NULL,
    `val1997` tinyint(1) NOT NULL,
    `val1998` tinyint(1) NOT NULL,
    `val1999` tinyint(1) NOT NULL,
     UNIQUE KEY `id` (`id`),
) ENGINE=MEMORY ;

そして、最大 500 個のフィールドを指定できる次のクエリ:

SELECT
  ( ABS(`val1`-12)
  + ABS(`val22`-22)
  + ABS(`val23`-3)
  + ABS(`val45`-87)
  + ABS(`val76`-23)
    ........
  + ABS(`val1324`-7)
  + ABS(`val1576`-29)
  ) as valcal,
  id
FROM `tableexample`
ORDER BY valcal ASC
LIMIT 5

また、からの番号ABSはクエリごとに一意であり (12、22、3、87、23、7、29、...)、範囲は 0 ~ 99 です。

私はいくつかのテストを行いました:

for 1000 records the sql run in 0.024 seconds
for 10000 records the sql run in 0.231 seconds
for 50000 records the sql run in 1.123 seconds
for 100000 records the sql run in 2.179 seconds
for 200000 records the sql run in 4.316 seconds
for 300000 records the sql run in 6.451 seconds

データベースには約 300,000 のレコードがあるため、最適化のヒントはありますか?

4

1 に答える 1

0

このクエリは、常に 300,000 レコードすべてに対して実行し、レコードごとに 500 回の計算を実行する必要があります。1 秒間におよそ 2,300 万回の計算を行っていますが、これは悪くありません。これを最適化する唯一の方法はハードウェアを改善することですが、それでも難しいです。

インデックスを追加しても役に立ちません。それが役立つ唯一の方法は、構造またはロジックを完全に再考することです。

于 2012-09-21T12:56:02.247 に答える