SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 03.03.2013 23:12:42

ADSoft
Участник
Зарегистрирован: 03.03.2013
Сообщений: 4

Оптимизация запросов из КЛАДР - составные ключи?

есть БД

Create table kladr
id int(11) autoincrement,
code varchar (13),
name varchar(40)


поле code - разбито на подгруппы ... AA BBB CCC DDD EE
где АА - регион, BBB - район, ССС - город, DDD - населенный пункт

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

select k.*, k1.name AS region, k2.name AS raion from taxi_st_kladr as k
left join taxi_st_kladr as k1 ON (LEFT(k.code,2)=LEFT(k1.code,2) AND RIGHT(k1.code,11)="00000000000")
left join taxi_st_kladr as k2 ON (LEFT(k.code,2)=LEFT(k2.code,2) AND MID(k.code,3,3)=MID(k2.code,3,3) AND RIGHT(k2.code,8)="00000000")
where (MID(k.code,3,3)!="000") AND k.name LIKE 'Моск%' limit 0,20


.... да, в таблице порядка 200 тыс записей

Отредактированно ADSoft (03.03.2013 23:13:22)

Неактивен

 

#2 03.03.2013 23:45:49

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Оптимизация запросов из КЛАДР - составные ключи?

Для начала можно создать отдельные поля в таблице с используемыми LEFT(k.code,2), RIGHT(k2.code,8) и MID(k.code,3,3) и одиночные индексы на них.

Неактивен

 

#3 04.03.2013 09:59:25

ADSoft
Участник
Зарегистрирован: 03.03.2013
Сообщений: 4

Re: Оптимизация запросов из КЛАДР - составные ключи?

в принципе помогло.. жаль не до конца )))
... группы отвечающие за регион, район, город и насел. пункт - выделил в доп. отдельные столбцы

region varchar(2)
raion varchar(3)
city varchar(3)
town varchar(3)

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

SELECT k.*, k1.name as region, k2.name as raion, k3.name AS city FROM `taxi_st_kladr` as k
 left join taxi_st_kladr AS k1 ON (k.region = k1.region AND RIGHT(k1.code,11)='00000000000')
 left join taxi_st_kladr AS k2 ON (k1.region = k2.region AND k1.raion = k2.raion AND RIGHT(k2.code,8)='00000000')
 left join taxi_st_kladr AS k3 ON (k2.region = k3.region AND k2.raion = k3.raion AND k2.city = k3.city AND RIGHT(k3.code,5)='00000')
WHERE k.name LIKE 'МОСКВ%' AND (k.region!="00" OR k.city!="000" OR k.town!="000")  LIMIT 0,10

... и он работает опять недостаточно быстро....
есть еще какие нить мысли и предложения? может вообще в принципе запрос как то неверно создаю?

Неактивен

 

#4 04.03.2013 11:45:21

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Оптимизация запросов из КЛАДР - составные ключи?

k2.region = k3.region AND k2.raion = k3.raion AND k2.city = k3.city AND RIGHT(k3.code,5)='00000'

Для этого поможет составной индекс KEY(region, raion, city, code)

Неактивен

 

#5 04.03.2013 12:02:35

ADSoft
Участник
Зарегистрирован: 03.03.2013
Сообщений: 4

Re: Оптимизация запросов из КЛАДР - составные ключи?

изменил джойны на подзапросы


SELECT k.*,
(SELECT k1.name FROM taxi_st_kladr as k1 where k.region=k1.region AND RIGHT(k1.code,11)='00000000000' limit 0,1) AS region,
(SELECT k2.name FROM taxi_st_kladr as k2 where k.region=k2.region AND k.raion=k2.raion AND RIGHT(k2.code,8)='00000000' limit 0,1) AS raion,
(SELECT k3.name FROM taxi_st_kladr as k3 where k.region=k3.region AND k.raion=k3.raion AND k.city=k3.city AND RIGHT(k3.code,5)='00000' limit 0,1) AS city,
(SELECT k4.name FROM taxi_st_kladr as k4 where k.region=k4.region AND k.raion=k4.raion AND k.town=k4.town AND RIGHT(k.code,2)='00' limit 0,1) AS town
FROM `taxi_st_kladr` as k
WHERE k.name LIKE "МОСКВ%" limit 0,30
 

вроде побыстрее стало ... правда странно .. иногда очень быстро отрабатывает.. иногда опять  неск. сек

- составной индекс KEY(region, raion, city, code) - не подскажите как составной индекс добавлять?

Неактивен

 

#6 04.03.2013 12:08:10

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Оптимизация запросов из КЛАДР - составные ключи?

ALTER TABLE taxi_st_kladr ADD KEY(region, raion, city, code)

Неактивен

 

#7 04.03.2013 13:45:56

ADSoft
Участник
Зарегистрирован: 03.03.2013
Сообщений: 4

Re: Оптимизация запросов из КЛАДР - составные ключи?

потрясающе! все укладывается в сотые доли секунды
огромное спасибо. А все же вопрос - почему подзапросы быстрее чем JOIN ?

Неактивен

 

#8 04.03.2013 19:33:04

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Оптимизация запросов из КЛАДР - составные ключи?

Про подзапросы непонятно. Смотрите EXPLAIN, вообще говоря бывает по-разному

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson