約 30 のテーブルを持つ複雑なデータベースがあります。1 つのテーブルには 500,000 を超える行があり、別のテーブルには 15,000 を超える行があり、今日まで 1 つのデータベースだけに実装することにするまで、両方を別のデータベースで使用していました。
今日まで、500,000 行のテーブルは MySQL データベースにあり、15,000 行のテーブルは PostgreSQL にありました。頻繁に使用される 1 ページで、これは PHP ベンチマークの結果でした。
getSimilarAvaiable - 0.0287 s
getUnavaiable - 0.27 s
ProcessDataOfUnavaiable - 1.4701 s
Process - 1.8622 s
TotalPageTime - 3.631 s
すべてを PostgreSQL に移行し、同じ SQL コードを変更せずに使用した後、同じページの結果は次のようになりました。
getSimilarAvaiable - 2.7465 s
getUnavaiableCars - 9.0763 s
ProcesseDataOfUnavaiableCars - 1.4167 s
ProcessCars - 1.7207 s
TotalPageTime - 14.9602 s
MySQL、同じインデックス、すべてにすべて同じものを入れましたが、なぜこの大きな違いがあるのか わかりません。これを最適化するにはどうすればよいですか?
編集:よりよく説明されました。
500.00 テーブルは、次の構造で構成されています。
id - bigint (primary key)
plate- varchar(10) Unique key
manufacturer - varchar(30)
vin - varchar(30)
主なクエリは次のようなものです。
SELECT plate, vin, 1 as n, substr(plate,1,2) as l
FROM imtt_vin WHERE substr(plate,1,1) >= 'A' and substr(plate,1,1) <= 'Z' AND
(manufacturer ILIKE '%".self::$Manufacturer."%') AND vin LIKE ?
UNION
SELECT plate, vin, 3 as n, substr(plate,4,2) as l
FROM imtt_vin WHERE substr(plate,4,1) >= 'A' and substr(plate,4,1) <= 'Z' AND
(manufacturer ILIKE '%".self::$Manufacturer."%') AND vin LIKE ?
UNION
SELECT plate, vin, 2 as n, substr(plate,7,2) as l
FROM imtt_vin WHERE substr(plate,7,1) >= 'A' and substr(plate,7,1) <= 'Z' AND
(manufacturer ILIKE '%".self::$Manufacturer."%') AND vin LIKE ?
ORDER BY n, l, plate;
EDIT2:複雑な単一のクエリでテストし、15 秒から 8/9 秒に短縮しました。それでも私には多すぎます。