Код: Выделить всё
-- organization: ~6,000 rows
CREATE TABLE organization (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
headquarterId INT,
-- other fields omitted
FOREIGN KEY (headquarterId) REFERENCES city(id)
);
-- city: ~150,000 rows
CREATE TABLE city (
id INT PRIMARY KEY AUTO_INCREMENT,
cityName VARCHAR(255) NOT NULL,
-- other fields omitted
INDEX idx_city_name (cityName DESC, id)
);
I have a more complex query that includes:
[*]Multiple LEFT JOINs (around 4),
[*]Several subqueries in both the SELECT and WHERE Clauses,
Ограничение 15 для страниц. 300–500 мс .
Вот упрощенная версия запроса:
Код: Выделить всё
SELECT *
FROM organization
LEFT JOIN city ON city.id = organization.headquarterId
ORDER BY city.cityName DESC;
Почему этот запрос все еще медленный , несмотря на индекс on city.cityname ? Соединенные таблицы? < /li>
перестройте запрос или предварительное сортирование с помощью подборочной помощи?-> Sort row IDs: city.`cityName` DESC (actual time=96.1..99.2 rows=9133 loops=1)
-> Table scan on (cost=5053..5170 rows=9143) (actual time=82.6..86.1 rows=9133 loops=1)
-> Temporary table (cost=5053..5053 rows=9143) (actual time=82.6..82.6 rows=9133 loops=1)
-> Nested loop left join (cost=4139 rows=9143) (actual time=0.0893..21.9 rows=9133 loops=1)
-> Table scan on organization (cost=939 rows=9143) (actual time=0.072..10.4 rows=9133 loops=1)
-> Single-row index lookup on city using PRIMARY (id=organization.headquarterId)
(cost=0.25 rows=1) (actual time=0.001..0.00103 rows=1 loops=9133)
< /code>
Что я нашел до сих пор < /h3>
Я читал, что индексы на соединенных столбцах не всегда используются < /strong> для < /code>, особенно когда сортировка столбца поступает в таблице соединений. Desc < /code> и id < /code>). < /Li>
Сорт требует времени из -за filesort < /strong> в плане запроса. < /Li>
< /ul>
фрагмент медленного плана
Подробнее здесь: https://stackoverflow.com/questions/795 ... ndex-usage