Медленные запросы в SQL - PullRequest
       1

Медленные запросы в SQL

0 голосов
/ 27 августа 2011

Я новичок в базе данных, когда дело доходит даже до умеренно больших наборов данных.У меня есть база данных SQL (на самом деле несколько баз данных sql, база данных SQLite, Postgres и MySQL), каждая из которых содержит одинаковые данные , выгруженные из IMDB .Я хочу сравнить эти разные базы данных.Основная таблица, которую я хочу запросить, содержит около 15 миллионов строк.Я хочу запрос, который пересекает два фильма, сейчас мой запрос выглядит так:

SELECT * from acted_in INNER JOIN actors 
ON acted_in.idactors = actors.idactors WHERE
(acted_in.idmovies = %d OR acted_in.idmovies = %d)

параметры - это случайно сгенерированные идентификаторы.Я хочу проверить относительную скорость работы баз данных, выполнив этот запрос несколько раз для случайно сгенерированных фильмов и посмотрев, сколько времени он занимает в среднем.Мой вопрос заключается в том, есть ли лучший способ сделать тот же запрос, я хочу присоединиться к тому, кто действовал во что с их информацией из любого из двух фильмов, так как это будет основной функциональностью для проекта, над которым я работаю, прямо сейчасскорость в настоящее время ужасна, средняя скорость для одного запроса составляет

sqlite: 7.160171360969543
postgres: 8.263306670188904
mysql: 13.27652293920517

Это среднее время на запрос (выборка занимает всего 100 запросов, но на данный момент она достаточно значительна).Так что я могу сделать лучше?Текущее время работы совершенно неприемлемо для любого практического использования.Я не думаю, что объединение занимает много времени, удаляя его, я получаю почти те же результаты, поэтому я считаю, что поиск - это то, что занимает много времени, так как я не набираю значительную скорость, когда я неприсоединяйтесь или ищите, используя условное ИЛИ.

Ответы [ 2 ]

5 голосов
/ 27 августа 2011

То, о чем вы здесь не упоминаете, - наличие каких-либо индексов в базах данных. Как правило, вы ускоряете запрос (за исключением ужасно написанных, а это не так) путем добавления индексов к вещам, которые используются в соединении или в критериях где. Это замедлит обновления, поскольку индексы необходимо обновлять каждый раз, когда обновляется таблица, но ускорит выбор с использованием этих атрибутов. Вы можете рассмотреть возможность добавления индексов к любым используемым вами атрибутам, которые еще не являются первичными ключами. Обязательно используйте один и тот же тип индекса во всех базах данных, чтобы быть справедливым.

0 голосов
/ 27 августа 2011

Прежде всего, микробенчмарки в базах данных довольно неинформативны, и на них не стоит основывать свое решение. Есть десятки лучших критериев для выбора БД, таких как надежность, поведение при больших нагрузках, доступность определенных функций (например, расширяемый язык, такой как расширение PostGIS для postgres, разбиение, ...), лицензия (!!) и т. Д. на.

Во-вторых, если вы хотите настроить свою базу данных или сервер базы данных, вам нужно учесть ряд вещей. Некоторые важные из них:

  • БД - это много памяти и быстрых дисков, поэтому настройте свой сервер с достаточным количеством обоих.
  • используйте функции анализа запросов, предлагаемые всеми основными БД (например, очень наглядную функцию объяснения в pgadmin для postgres), чтобы анализировать поведение запросов, важных для вашего варианта использования, и адаптировать БД на основе того, что вы узнали из анализы (например, дополнительные или другие показатели)
  • учитесь хорошо понимать ваш сервер баз данных, это довольно сложные программы с множеством настроек, которые влияют на их поведение и производительность
  • убедитесь, что вы понимаете рабочую нагрузку, которой подвергается ваша БД, например, с помощью инструмента, подобного pgfouine для postgres, другие существуют для баз данных других марок.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...