Как создать индекс SQL для повышения производительности ORDER BY - PullRequest
1 голос
/ 18 июня 2009

У меня есть некоторый SQL, похожий на следующий, который объединяет четыре таблицы и затем упорядочивает результаты по столбцу «status» первой:

SELECT * 
 FROM a, b, c, d 
 WHERE b.aid=a.id AND c.id=a.cid AND a.did=d.id AND a.did='XXX'
 ORDER BY a.status

Это работает. Тем не менее, это медленно. Я понял это из-за предложения ORDER BY и отсутствия какого-либо индекса в таблице "a".

Все четыре таблицы имеют ПЕРВИЧНЫЕ КЛЮЧИ, установленные в столбце "id".

Итак, я знаю, что мне нужно добавить индекс в таблицу a, который включает столбец "status", но что еще нужно включить? Должны ли "bid", "cid" и "did" быть там тоже?

Я пытался задать это в общем смысле SQL, но, если это важно, целью является SQLite для использования с Gears.

Заранее спасибо,

Джейк (нуб)

Ответы [ 3 ]

4 голосов
/ 18 июня 2009

Я бы сказал, что это медленно, потому что двигатель делает сканирование повсюду, а не ищет. Вы имели в виду вместо этого SELECT a. *? Это было бы также быстрее, SELECT * здесь эквивалентно a. *, B. *, C. *, D. *.

Вероятно, вы получите лучшие результаты, если поместите отдельный индекс в каждый из этих столбцов:

  • a.did (так что a.did = 'XXX' - это поиск вместо сканирования, также помогает a.did = d.id)
  • a.cid (для a.cid = c.id)
  • b.aid (для a.id = b.aid)

Вы можете попробовать добавить Status в первый и второй индексы в порядке ASCENDING, чтобы повысить производительность - это не помешает.

0 голосов
/ 18 июня 2009

Вы пробовали присоединения?

выберите * из внутреннего соединения b для внутреннего соединения a.id = b.aid c для внутреннего соединения a.cid = c.id d для a.did = d.id где a.did = 'XXX' ЗАКАЗАТЬ по a.status

правильное использование объединений (левый, ричтовый, внутренний, внешний) зависит от структуры таблиц

надеюсь, это поможет

0 голосов
/ 18 июня 2009

Мне было бы интересно узнать, как вы выяснили, что проблема заключается в «предложении ORDER BY и отсутствии какого-либо индекса в таблице« a »». Я нахожу это немного подозрительным, потому что в таблице a есть индекс первичного ключа, как вы потом скажете.

Рассматривая природу запроса и то, что я могу догадаться о природе данных, я думаю, что этот запрос, как правило, даст относительно мало результатов по сравнению с размером используемых таблиц, и, таким образом, ORDER BY было бы очень дешево. Конечно, это всего лишь предположение.

Будет ли индекс вообще помогать, зависит от данных в таблице. Какие показатели будет использовать ваш оптимизатор запросов при выполнении запроса, зависит от множества различных факторов, одним из самых больших из которых является ожидаемое количество результатов, полученных в результате поиска.

Одна вещь, которая очень помогла бы, это если бы вы опубликовали результаты EXPLAINing вашего запроса.

...