3 / 3 / 0
Регистрация: 07.04.2014
Сообщений: 82
|
|||||||||||
1 | |||||||||||
Оптимизация запроса07.04.2014, 14:06. Показов 1113. Ответов 18
Метки нет (Все метки)
Здравствуйте. Ломаю голову об оптимизации запроса.
Есть две таблицы
Движок и фиксированный формат строк выбраны для скорейшей обработки. Кодировка для минимизации объёма выдаваемых данных. Нужно максимально быстро выдать результат вот такого запроса
Будет ли быстрее, если я вместо id1 и id2 введу строку id1.id2 и буду искать значение не равное ей?
0
|
07.04.2014, 14:06 | |
Ответы с готовыми решениями:
18
Оптимизация запроса Оптимизация запроса Оптимизация запроса Оптимизация запроса |
0 / 0 / 1
Регистрация: 03.06.2013
Сообщений: 39
|
||||||
07.04.2014, 14:53 | 2 | |||||
Как по мне то в принципе и так должно искать достаточно быстро.
Но я бы использовал JOIN вместо перебора:
0
|
3 / 3 / 0
Регистрация: 07.04.2014
Сообщений: 82
|
|
07.04.2014, 15:01 [ТС] | 3 |
Таблице test 65 535 строк, в таблицу test_connection 1 000 000. Время выполнения запроса 14 минут 29 секунд. Долго очень. Поиск без индексов.
Для использования внешних ключей придётся использовать InnoDB. Я не пробовал, но боюсь что будет ещё дольше. Скоро протестирую. А разве JOIN не медленнее, перебора?
0
|
0 / 0 / 1
Регистрация: 03.06.2013
Сообщений: 39
|
|
07.04.2014, 16:34 | 4 |
Движок MYISAM быстро работает только на инсертах, на селекте он уступает InnoDB.
В свою очередь InnoDB уступает на селекте MYISAM. попробуйте поменять движок.
0
|
3 / 3 / 0
Регистрация: 07.04.2014
Сообщений: 82
|
|
07.04.2014, 16:45 [ТС] | 5 |
Myisam с join 13:42
Innodb c join 12:21 Innodb c перебором 13:55 2 минуты отъиграли. Добавлено через 34 секунды Странно, что join быстрее. Почему?
0
|
0 / 0 / 1
Регистрация: 03.06.2013
Сообщений: 39
|
|
07.04.2014, 16:51 | 6 |
Потому что JOIN проверяет только те строки которые подходят по условию.
Добавлено через 2 минуты Еще можно проиндексировать таблицу test_connection по id2. Возможно поможет
0
|
3 / 3 / 0
Регистрация: 07.04.2014
Сообщений: 82
|
|
07.04.2014, 16:58 [ТС] | 7 |
Не поможет.
EXPLAIN показывает, что не используются индексы. Более того: Using temporary; Using filesort; Using where; Using join buffer (flat, BNL join). И проход по всем значениям всех таблиц. Как ускорить?
0
|
0 / 0 / 1
Регистрация: 03.06.2013
Сообщений: 39
|
|
07.04.2014, 17:19 | 8 |
Если вам нужна первая запись с конца, то никак
0
|
3 / 3 / 0
Регистрация: 07.04.2014
Сообщений: 82
|
|
07.04.2014, 17:24 [ТС] | 9 |
А если я могу этим поступиться, то как? Пусть вообще без сортировки будет. Любая запись, соответствующая условию WHERE.
Кстати сработал индекс по id1 даже с ORDER BY. Получилось 08:44.
0
|
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
|
|
07.04.2014, 17:32 | 10 |
Сообщение было отмечено paveltkachev как решение
Решение
попробуйте такие:
test_connection(id1,id2) test(dttm,id,t)
1
|
0 / 0 / 1
Регистрация: 03.06.2013
Сообщений: 39
|
|
07.04.2014, 17:36 | 11 |
Без DESC запрос должен выдать первый результат выборки и на этом остановиться.
0
|
1313 / 945 / 144
Регистрация: 17.01.2013
Сообщений: 2,348
|
|
07.04.2014, 17:38 | 12 |
Можно в test(dttm,id,t) не включать t и id, чтобы уменьшить размер индекса, но тогда много времени уйдет на RID-чтение (поиск по кластерному ключу и получение данных из него)
0
|
3 / 3 / 0
Регистрация: 07.04.2014
Сообщений: 82
|
|
07.04.2014, 17:53 [ТС] | 13 |
Спасибо! Индексы сработали. Результат выдаётся мгновенно!
Добавлено через 2 минуты Если текстовых полей несколько, то я правильно понимаю, что оптимально будет в 2 запроса: первым я найду id, а вторым по id получу значения текстовых полей. Добавлено через 7 минут При большом количестве таких запросов какой движок лучше выбрать?
0
|
0 / 0 / 1
Регистрация: 03.06.2013
Сообщений: 39
|
|
07.04.2014, 17:55 | 14 |
Innodb
0
|
3 / 3 / 0
Регистрация: 07.04.2014
Сообщений: 82
|
|
07.04.2014, 18:08 [ТС] | 15 |
А нагрузка при этом будет выше?
Добавлено через 1 минуту Дискового пространства занимать будет в 2 раза больше.
0
|
0 / 0 / 1
Регистрация: 03.06.2013
Сообщений: 39
|
|
07.04.2014, 18:17 | 16 |
0
|
3 / 3 / 0
Регистрация: 07.04.2014
Сообщений: 82
|
|
07.04.2014, 18:38 [ТС] | 17 |
При тех же индексах MuISAM требует меньше в 1,5 раза места на жёстком диске.
0
|
0 / 0 / 1
Регистрация: 03.06.2013
Сообщений: 39
|
|
07.04.2014, 18:41 | 18 |
да, но MyISAM на SELECT-е медленнее работает и это факт
Добавлено через 27 секунд MyISAM надо юзать когда нужен моментальный инсерт в базу Добавлено через 24 секунды во всех остальных случаях Innodb Добавлено через 10 секунд для временных таблиц мемори
0
|
3 / 3 / 0
Регистрация: 07.04.2014
Сообщений: 82
|
|
07.04.2014, 18:47 [ТС] | 19 |
А дорого стоит поддержка внешних ключей и транзакции?
0
|
07.04.2014, 18:47 | |
07.04.2014, 18:47 | |
Помогаю со студенческими работами здесь
19
Оптимизация запроса Оптимизация запроса оптимизация запроса Оптимизация запроса Оптимизация запроса Нужна оптимизация запроса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |