MySQL оптимизация запросов (неправильные индексы?) избегать сортировки файлов - PullRequest
1 голос
/ 22 февраля 2011

Я постараюсь объяснить себя быстро.У меня есть база данных под названием «artikli», которая содержит около 1 млн записей.В этой таблице я запускаю много разных запросов, но один из них вызывает проблемы (длительное время выполнения), когда присутствует ORDER by.

Это моя структура таблицы:

CREATE TABLE IF NOT EXISTS artikli (
  id int(11) NOT NULL,
  name varchar(250) NOT NULL,
  datum datetime NOT NULL,
  kategorije_id int(11) default NULL,
  id_valute int(11) default NULL,
  podogovoru int(1) default '0',
  cijena decimal(10,2) default NULL,
  valuta int(1) NOT NULL default '0',
  cijena_rezerva decimal(10,0) NOT NULL,
  cijena_kupi decimal(10,0) default NULL,
  cijena_akcija decimal(10,2) NOT NULL,
  period int(3) NOT NULL default '30',
  dostupnost enum('svugdje','samobih','samomojgrad','samomojkanton') default 'svugdje',
  zemlja varchar(10) NOT NULL,
  slike varchar(500) NOT NULL,
  od_s varchar(34) default NULL,
  od_id int(10) unsigned default NULL,
  vrsta int(1) default '0',
  trajanje datetime default NULL,
  izbrisan int(1) default '0',
  zakljucan int(1) default '0',
  prijava int(3) default '0',
  izdvojen decimal(1,0) NOT NULL default '0',
  izdvojen_kad datetime NOT NULL,
  izdvojen_datum datetime NOT NULL,
  sajt int(1) default '0',
  PRIMARY KEY  (id),
  KEY brend (brend),
  KEY kanton (kanton),
  KEY datum (datum),
  KEY cijena (cijena),
  KEY kategorije_id (kategorije_id,podogovoru,sajt,izdvojen,izdvojen_kad,datum)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

И вот этот запрос:

SELECT artikli.datum as brojx, 
     artikli.izdvojen as i, 
     artikli.izdvojen_kad as ii, 
     artikli.cijena as cijena, artikli.name 
FROM artikli 
WHERE artikli.izbrisan=0 and artikli.prodano!=3 
     and artikli.zavrseno=0 and artikli.od_id!=0 
     and (artikli.sajt=0 or (artikli.sajt=1 and artikli.dostupnost='svugdje')) 
     and kategorije_id IN (18) 
ORDER by i DESC, ii DESC, brojx DESC 
LIMIT 0,20

Что я хочу сделать, это избежать файловой сортировки, которая очень медленная.

Ответы [ 3 ]

1 голос
/ 22 февраля 2011

Было бы очень полезно, если бы вы предоставили план объяснения для запроса.

Почему, по вашему мнению, именно файловая сортировка вызывает проблему?Глядя на запрос, вы, похоже, применяете много фильтрацию - которая должна значительно уменьшить набор вывода - но ни один из них не может использовать доступные индексы.

artikli.izbrisan=0 and artikli.prodano!=3 
 and artikli.zavrseno=0 and artikli.od_id!=0 
 and (artikli.sajt=0 or (artikli.sajt=1 and artikli.dostupnost='svugdje')) 
 and kategorije_id IN (18) 

Хотя я не делаюЯ знаю, какова структура ваших данных, я подозреваю, что вы могли бы получить гораздо большую выгоду, добавив индекс:

kategorije_id,izbrisan,sajt

Все эти другие индексы действительно уже используются?

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

C.

0 голосов
/ 22 февраля 2011

На самом деле, порядок не является основой для нужного вам индекса ... но КРИТЕРИИ, которые вы хотите в основном соответствовать запросу ... Отфильтровав меньший набор данных, вы получите меньший набор таблицы... Я бы немного изменил предложение WHERE, но вы будете лучше знать свои данные.Сначала поставьте наименьшее ожидаемое условие и убедитесь, что индекс основан на этом ... что-то вроде

WHERE  
       artikli.izbrisan = 0 
   and artikli.zavrseno = 0 
   and artikli.kategorije_id IN (18)  
   and artikli.prodano != 3
   and artikli.od_id != 0
   and (    artikli.sajt = 0 
        or (     artikli.sajt = 1
             and artikli.dostupnost='svugdje')
           )

и имеет составной индекс (izbrisan, zavrseno, kategorije_id) ... У меня есть режим другого! = сравнения после того, как они не являются конкретными значениями ключа, вместо этого они ВСЕ, КРОМЕ СУЩЕСТВУЮЩЕГО значения, о котором идет речь.

0 голосов
/ 22 февраля 2011

Проблема в том, что у вас нет индекса для столбцов izdvojen, izdvojen_kad и datum, которые используются ORDER BY.

Обратите внимание, что большой индекс, который вы начинаете с kategorije_id, не может использоваться для сортировки (хотя это немного поможет с предложением where), поскольку сортируемые столбцы находятся в конце индекса.

...