LINUX.ORG.RU

Слишком долго выполняется SQL-запрос


0

3

Вобщем, проблема... Есть запрос:

select firms.kod, firms.title, firms.pay, rekv.director, address.addr as address, address.phones
from firms left join rekv on (firms.kod=rekv.kod) left join address on (firms.kod=address.kod)
where firms.manager=".$manager['manager']." order by firms.title

таблица firms - 19300+ записай rekv - 6900 записей address - 24200+ записей

Данные, полученные в результате выполнения запроса обрабатываются далее при помощи smarty.

Данный запрос выполняется порядка 3х минут (при результирующем количестве записей около 1000). Это слишком долго... Как можно оптимизировать запрос или алгоритм выборки, чтобы уменьшить время выборки хотя бы секунд до 30-40?

И да. Локально это все выполняется около 10 секунд (MySQL 5.5.22), а проблема на сервере (который стоит у нас же в офисе - MySQL 5.0.51) Может ли это зависеть от версии мускла?


а индексация по kod в таблице присутствует?

да и вообще сделаете EXPLAIN запрос.

anonymous ()

надеюсь, у тебя в коде не так, как в ОП??

1) $manager['manager'] = «\»; drop table firms; --"
2) ??
3) profit!

aol ★★★★★ ()

натрави explain на него со своей тачки, и с сервака в офисе. сравни.
может, на серваке индексов не хватает?

aol ★★★★★ ()

таблица firms - 19300+ записай rekv - 6900 записей address - 24200+ записей

Ковыряй 1. Индексы 2. Обьём памяти, выделенный мускулю на сервере. Потому что на таких обьёмах мускуль с индексами должен делать это ОЧЕНЬ быстро.

Alve ★★★★★ ()

В первую очередь EXPLAIN, оттуда уже и плясать. Вообще запрос не сложный, не должен тормозить.

VirRaa ★★★ ()
Ответ на: комментарий от aol

базы идентичны. Тут уже второй форм, на котором советуют натравить EXPLAIN. Как это сделать. Вывод, думаю, разберу по ходу дела

RJ45 ()
show index from firms
show index from address

Для начала

Minoru ★★★ ()
Ответ на: комментарий от wewewe

блобов нет. Индексы в firm примари по полю kod в address - primary по id и 2 индекса по kod и addr

Меня дико смущает скорость выборки на разных машинах (базы идентичны). Может, настройки сервера?

RJ45 ()

Выявил странность: В копии базы, где работает медленно, в таблице address по полю kod индекс и у него cardinality = NULL, а в копии, где быстро cardinality = 24251 (то же и в нескольких других индексах в разных таблицах базы). Как пересчитать индексы - дропнуть их и создать заново?

Может, пригодится: Базе уже больше 4х лет, общий объем больше 1.6Гб (выгуглил, что на больших базах бывают чудеса с индексами)

RJ45 ()
Ответ на: комментарий от RJ45

должно работать.

NULL cardinality on an MyISAM table's index occurs when a table > is created (or truncated) and populated with data.
AFTER the load the user MUST perform an 'Analyze Table x' to effectively gain cardinality for that table.

kelyar ★★★★★ ()
Ответ на: комментарий от kelyar

помог myisamchk -a address Правта таблица закрашилась, но myisamchk -ar address все поправил. carfinality пересчиталось, запросы стали выполняться быстрее в десятки раз.

RJ45 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.