Вопрос № 79901: Здравствуйте эксперты.
Есть в наличии 2 таблицы (в приложении).
Таблица blocks содержит примерно 2,5 миллиона записей,
все поля числовые.
Таблица location содержит примерно 200 тысяч записей.
Запросов на выборку значений намечаетс...
Вопрос № 79.901
Здравствуйте эксперты.
Есть в наличии 2 таблицы (в приложении).
Таблица blocks содержит примерно 2,5 миллиона записей,
все поля числовые.
Таблица location содержит примерно 200 тысяч записей.
Запросов на выборку значений намечается более 30 000 в день.
Обе таблицы связанны между собой по полю id, нужно выбрать все поля из таблицы location.
На данный момент делается 2 запроса, первый запрос к таблице blocks имеет логику SELECT `id` from `blocks` where `ip_start`<='1441400593' and `ip_stop` >='1441400593' и второй к таблице location SELECT* from `location` where `id`='184'.
Из-за того, что записей и обращений к базе данных ( MySQL) очень много они обрабатываются непростительно долго.
Как можно оптимизировать запросы, может вместо двух делать один? Может создать "хитрые" индексы?
Какие могут быть варианты оптимизации??
Приложение:
Отправлен: 27.03.2007, 07:07
Вопрос задал: Cimus (статус: Студент)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 5)
Отвечает: dianacode
Доброе время суток, Cimus
первое, куда вы длжны были пойти - это оригинал документации, в нашем случае - документация mysql на оффсайте http://dev.mysql.com/doc/refman/5.1/en/optimization.html
с уважением, удачи
--------- There is more than one way to do it.
Ответ отправила: dianacode (статус: Студент)
Ответ отправлен: 27.03.2007, 09:10 Оценка за ответ: 3 Комментарий оценки: Увеличить быстродействие получилось только после выноса таблицы blocks в текстовый файл, об этом в мануале не пишут. (Смотрите мини-форум) Ваш ответ не имеет вообще смысла.
Отвечает: Игорь Елизаров
Здравствуйте, Cimus!
Первое, на что надо обратить внимание - индексация таблиц.
Если поле id в таблице location уникально, сделайте его первичным ключем этой таблицы.
аналогично рекомендуется сделать первичный ключ и для таблицы Blocks но там, похоже, для этого надо будет добавить поле id_block и сделать его уникальным.
скорее всего, дело именно в этом.
с уважением, Игорь
--------- Пользователь - тоже человек..
Ответ отправил: Игорь Елизаров (статус: 10-ый класс)
Ответ отправлен: 27.03.2007, 09:11 Оценка за ответ: 4 Комментарий оценки: БД MySQL не обеспечила должной производительности, был найден другой метод. (См. мини-форум)
Отвечает: Архангельский Андрей Германович
Здравствуйте, Cimus!
1) не увидел обычных Primary key - поставьте их по крайней мере во второй таблице на ID
2) У вас два поля сравнения в 1 запросе. Сделайте два простых индекса - отдельно на поле ip_start и отдельно на поле ip_stop
И, наконец, многое зависит, от того сколько записей в результате запроса. Если их больше чем 20% от общего количества то индексы помогают мало.
Посмотрите план запроса - скорее всего MySQL создает именно такие индексы - поэтому их лучше создать в ручную.
Непонятно, что хотите получить в результате - возможно один запрос будет давать лучшие результаты.
--------- Если дело заслуживает быть сделаным, то оно заслуживает, чтобы его сделали ХОРОШО
Ответ отправил: Архангельский Андрей Германович (статус: Специалист)
Ответ отправлен: 27.03.2007, 10:59 Оценка за ответ: 4 Комментарий оценки: Результат выборки всего 1 запись, индексы по полям ip_start и ip_stop на скорость выборки не повлияли. См. мини-форум.