У меня сложная база данных, около 30 таблиц. Одна таблица содержит более 500 000 строк, а другая - более 15 000, и я использую обе в отдельной базе данных до сегодняшнего дня. Я решил внедрить ее только в одну базу данных.
До сегодняшнего дня таблица с 500 000 строк находилась в базе данных MySQL, а таблица с 15 000 строк - в PostgreSQL. На одной странице интенсивного использования это был результат теста 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 секунд. Даже для меня это слишком.