SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 21.04.2011 12:22:26

Aqula
Участник
Зарегистрирован: 12.01.2011
Сообщений: 21

Помогите оптимизировать запрос.

SELECT u.name, c.comp_name, c.news, s.sector_name, f.coef_group, f.coef_name, f.coef_hint, v.coef_id, v.acc_std, v.year, v.quarter, v.value FROM  tab_comp AS c , tab_coef AS f, tab_users AS u, tab_val AS v, tab_sectors AS s  WHERE c.id = v.comp_id AND v.comp_id = " . $comp_id . " AND f.id = v.coef_id AND u.user_id = v.user_id AND c.sector_id = s.id ORDER BY 8, 9";

Выполняется долго. И это при малом колчиестве данных.
c.comp_name, c.news, s.sector_name эти поля с одним значением. Думал сделать отдельным запросом с Distinct, но знакомый настоятельно учил, чтоб было всегда минимальное количество запросов. Я и ужимаю всегда в один. А тормозит из-за новостей c.news (text) для каждого строки выводятся. Это есть не хорошо. Помогите плиз...

Неактивен

 

#2 21.04.2011 16:40:55

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Помогите оптимизировать запрос.

А Вы можете положиться на то, что знакомый всегда прав? smile Мы тут учим, что
простые и легко читаемые запросы часто лучше сложных, но «один» smile

Если Вы сами знаете, что news почти никогда не нужен, то выбирать его не стоит.
Стоит выбирать его тогда, когда он нужен. Если хотите играть с этим запросом, то
надо смотреть на explain: при таком количестве таблиц могли просто ключик про-
пустить какой-то.

Неактивен

 

#3 21.04.2011 16:53:41

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Помогите оптимизировать запрос.

Aqula написал:

Выполняется долго. И это при малом количестве данных.

В каждой табличке по отдельности может быть и не очень много данных, но Вы же выбираете из 5 таблиц сразу - при отсутствии индексов mysql будет вынужден перебрать n1*n2*n3*n4*n5 записей, где
n1 - количество строк в tab_comp,
n2 - количество строк в tab_coef,
n3 - количество строк в tab_users,
n4 - количество строк в tab_val,
n5 - количество строк в tab_sectors.

В плюс к explain'у запроса покажите пожалуйста
show create table на таблицы.

Отредактированно deadka (21.04.2011 16:53:55)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#4 21.04.2011 20:08:52

Aqula
Участник
Зарегистрирован: 12.01.2011
Сообщений: 21

Re: Помогите оптимизировать запрос.

Спасибо за помощь. Я тут начал разделять запрос на 2. Стал чуть побыстрее работать. Сделал EXPLAIN
SQL-запрос: EXPLAIN SELECT u.name, f.coef_group, f.coef_name, f.coef_hint, v.coef_id, v.acc_std, v.year, v.quarter, v.value FROM dle_coef AS f, dle_users AS u, dle_val AS v, dle_sectors AS s WHERE v.comp_id = 8 AND f.id = v.coef_id AND u.user_id = v.user_id ORDER BY 5, 6;
Строки: 4
id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra
1    SIMPLE    v    ref    id_comp,id_coef    id_comp    3    const    1387    Using where; Using temporary; Using filesort
1    SIMPLE    f    eq_ref    PRIMARY    PRIMARY    2    b32203.v.coef_id    1    
1    SIMPLE    u    eq_ref    PRIMARY    PRIMARY    3    b32203.v.user_id    1    
1    SIMPLE    s    index    NULL    PRIMARY    1    NULL    25    Using index

Неактивен

 

Board footer

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