Задавайте вопросы, мы ответим
Вы не зашли.
Таблицы
Неактивен
Вообще, как работает MySQL она ищет по всем столбцам запроса сразу все строчки, или же сначала берёт первое искомое, прогоняет его, находит соответствия, а второе уже гонит по результату первого?
Неактивен
animegirl написал:
Вопрос:
Если добавить выборку по country_id, это ускорит процесс?
О каком процессе идет речь?
Понятно, когда речь идет об изменении запроса с целью улучшения производительности (подзапрос переписать через join, разбить запрос не несколько простых и т.д.) Но вы сравниваете два разных запроса в рамках какого-то процесса.
animegirl написал:
Какие индексы для такого запроса лучше тогда использовать?
Посмотрите explain, если `tech_regions_names` главная в объединении, то достаточно на country_id, иначе на (`region_id`,country_id).
Кроме того важно сколько уникальных значений принимает country_id, если мало, то и смысла в индексе на эту колонку нет.
Неактивен
animegirl написал:
Вообще, как работает MySQL она ищет по всем столбцам запроса сразу все строчки, или же сначала берёт первое искомое, прогоняет его, находит соответствия, а второе уже гонит по результату первого?
сразу
Неактивен
vasya написал:
animegirl написал:
Вопрос:
Если добавить выборку по country_id, это ускорит процесс?О каком процессе идет речь?
Понятно, когда речь идет об изменении запроса с целью улучшения производительности (подзапрос переписать через join, разбить запрос не несколько простых и т.д.) Но вы сравниваете два разных запроса в рамках какого-то процесса.animegirl написал:
Какие индексы для такого запроса лучше тогда использовать?
Посмотрите explain, если `tech_regions_names` главная в объединении, то достаточно на country_id, иначе на (`region_id`,country_id).
Кроме того важно сколько уникальных значений принимает country_id, если мало, то и смысла в индексе на эту колонку нет.
Почему? Это одинаковые запросы, только во втором добавлено `tech_regions_names`.`country_id`= оно не обязательно, найдут и без него, но как вы сами написали, стран будет не более 250, а регионов скажем 20000 языков возьмём будет 100, это уже 200к строк, и это регионы, дальше идут города, это уже сходу можно добавит 3 нуля в сумму строк. Вот я и подумала, что если указывать ИД верхней зоны, укорочу-ли я тем самым список который будет перебираться?
Неактивен
country_id не всегда будет присутствовать в передачи данных, какой из вариантов лучше выбрать:
1. Забить на него в выборке так как на исход он никак не влияет
2. добавить его в том виде как сейчас, индекс на region_id и индекс на country_id
3. добавить его сделав индекс на обе колонки country_id вместе с region_id
?
Неактивен
Я не могу понять такую вещь, если делать индексы, нужно делать сразу по всем колонкам, что заданы в запросе, или же если допустим колонки 3 и только одна индекс, оно тоже поможет?
Неактивен
animegirl написал:
Я не могу понять такую вещь, если делать индексы, нужно делать сразу по всем колонкам, что заданы в запросе, или же если допустим колонки 3 и только одна индекс, оно тоже поможет?
Всё зависит от ваших данных. По всем колонкам это как правило нерентабельно
Во-первых, если не трудно - приводите запросы без вот этих конструкций '.waysql_secure($_POST['MB']).', поставьте туда конкретные данные, так и читать будет легче гораздо, и сразу будет видно какие типы данных используются.
Во-вторых, сделайте пожалуйста EXPLAIN этих двух запросов и покажите, а то мы тут вилами по воде практически
Я бы сделал в первой таблице индекс region_id+country_id, а во-второй region_id + 4 индекса (left,top,right,bottom) и проверил експлейном (не уверен что mysql последние будет использовать). Но это опять же не зная данных
Кстати это что вообще, вот эти top,bottom,left,right - координаты? координаты чего?
Неактивен
Извиняюсь, там везде цифры, я думала из таблицы будет понятно, там же тип указан вроде.
Сейчас попытаюсь эксплайн сделать.
Так там ведь и так они именно так сделаны, или вы предлагаете вообще все 5 столбцов в один индекс, разве это разумно? Ведь тоже самое, что и без индексов совсем. Хотя может быть я не верно понимают их работу. А по поводу взять в один индекс region_id и country_id, можно, но country_id, он не всегда имеется, иногда надо без него, это опционально, если передаётся, то можно использовать, весь вопрос в том, имеет ли смысл вообще использовать?
Это координаты открытой карты, края карты.
Неактивен
нет, у вас один составной индекс, работать из него будет в лучшем случе только левая часть (top), я же вам написал про 4 отдельных индекса
Неактивен
Так
Неактивен
animegirl написал:
Почему? Это одинаковые запросы, только во втором добавлено `tech_regions_names`.`country_id`= оно не обязательно, найдут и без него
Т.е. независимо от того если ли условие по country_id результат будет одинаков?
Тогда нужно смотреть eplain, если tech_regions_names главная в объединении, то ускорит выборку, в противном случае замедлит (незначительно).
Что касается работы составных индексов, то рекомендую посмотреть FAQ №5
Неактивен
Неактивен
Я ещё что подумала, есть смысл заменить
Неактивен
animegirl написал:
Я ещё что подумала, есть смысл заменить
(25<=`tech_regions_positions`.`longitude_left` AND `tech_regions_positions`.`longitude_left`<=25)на(`tech_regions_positions`.`longitude_left` BETWEEN 25 AND 25)?
Нет, это синонимы.
Explain показывает, что объединение идет с таблицы tech_regions_positions и дополнительное условие на `country_id` ухудшает план, приводя к лишней проверке. (Using where во втором плане)
Неактивен
Понятно, значит убрать. А по поводу индексов, я ведь в итоге правильно их объединила? Я прочила тему по ссылке из фага, если я правильно поняла, то у меня уже всё верно, или?
Неактивен
У вас действительно используется весь составной индекс, но лишь по причине того, что вы рассматриваете частный случай, когда верхняя и нижняя границы диапазона равны, т.е. ваше условие эквивалентно
( `longitude_left`=25 OR `longitude_right`=25 ) AND ( `latitude_top`=25 OR `latitude_bottom`=25 )
В противном случае картина будет совсем другой. Кстати, и условие на country_id тоже нужно проверять на общем случае.
Неактивен
Ну тогда я к этому вернусь позже, пока в таблицах нету данных особо.
Неактивен
«Преждевременная оптимизация - корень всех зол»
http://webew.ru/articles/275.webew
Неактивен
vasya написал:
Explain показывает, что объединение идет с таблицы tech_regions_positions и дополнительное условие на `country_id` ухудшает план, приводя к лишней проверке. (Using where во втором плане)
Как это к лишней? )
Это же все равно что искать в базе Ивановых, но если среди них искать еще и Андреев - то новое условие ухудшит план )))
animegirl написал:
Значит убрать
Условие либо нужно либо нет, если результат не зависит от country_id - то зачем вообще это условие в запросе? Если country_id влияет на запрос - как вы его уберете, если оно необходимо для уточнения результата?
Пусть region_id - это фамилия, а country_id имя. Вам всегда нужно из базы выбирать только по фамилиям? Или по фамилии и имени тоже бывает нужно? Если первое, то индекс нужен только по фамилии, если второе - то имеет смысл сделать составной индекс фамилия+имя.
Вот вы explain привели - вижу там что есть доступный индекс country_id - это индекс по полю country_id или составной по region_id+country_id (как я вам писал выше)? Если по только country_id - в нем вообще никакого смысле нет при ваших запросах. А составной может привести к тому, что у запроса может план выполнения поменяться на противоположный, т.к. грамотно составные составные индексы, как правило очень селективны и оптимизатор может поменять мнение о том, с какой таблицы начинать.
Неактивен
На результат выдачи не повлияет, думала, может на скорость будет влиять.
Неактивен
а что в этом поле? region_id = country_id, они равны?
Неактивен
Кстати
Неактивен
Нет, идут страны, регионы, города
Страны сами по себе, регионы с привязкой к стране, города с привязкой к регионам и странам.
Так как регионов больше чем стран, думала, указание страны, ускорит поиск региона в базе, сам поиск будет идти по координатам либо имени. Но ход моей мысли был таков, если я укажу ИД страны, то движок откинет наперёд не нужную часть данных.
Неактивен
Shopen написал:
Кстати
CREATE TABLE IF NOT EXISTS `tech_regions_names` (
....
PRIMARY KEY (`region_id`,`region_language`),
KEY `region_id` (`region_id`),
...
) ...
индекс region_id - лишний, т.к. является префиксом PRIMARY
Поняла, спасибо. Буду знать
Неактивен