SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 07.12.2011 06:32:12

Liho
Участник
Зарегистрирован: 07.12.2011
Сообщений: 1

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

Есть таблица (из CMS DataLife Engine smile)

CREATE TABLE dle_post (
  `id` int(11) NOT NULL auto_increment,
  `autor` varchar(40) NOT NULL default '',
  `date` datetime NOT NULL default '0000-00-00 00:00:00',
  `short_story` text NOT NULL,
  `full_story` text NOT NULL,
  `xfields` text NOT NULL,
  `title` varchar(255) NOT NULL default '',
  `descr` varchar(200) NOT NULL default '',
  `keywords` text NOT NULL,
  `category` varchar(200) NOT NULL default '0',
  `alt_name` varchar(200) NOT NULL default '',
  `comm_num` mediumint(8) unsigned NOT NULL default '0',
  `allow_comm` tinyint(1) NOT NULL default '1',
  `allow_main` tinyint(1) unsigned NOT NULL default '1',
  `allow_rate` tinyint(1) unsigned NOT NULL default '1',
  `approve` tinyint(1) NOT NULL default '0',
  `fixed` tinyint(1) NOT NULL default '0',
  `rating` smallint(5) NOT NULL default '0',
  `allow_br` tinyint(1) NOT NULL default '1',
  `vote_num` smallint(5) unsigned NOT NULL default '0',
  `news_read` MEDIUMINT(8) unsigned NOT NULL default '0',
  `votes` tinyint(1) NOT NULL default '0',
  `access` varchar(150) NOT NULL default '',
  `symbol` varchar(3) NOT NULL default '',
  `flag` tinyint(1) NOT NULL default '1',
  `editdate` varchar(15) NOT NULL default '',
  `editor` varchar(40) NOT NULL default '',
  `reason` varchar(255) NOT NULL default '',
  `view_edit` tinyint(1) NOT NULL default '0',
  `tags` VARCHAR(255) NOT NULL default '',
  `metatitle` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`id`),
  KEY `autor` (`autor`),
  KEY `alt_name` (`alt_name`),
  KEY `category` (`category`),
  KEY `approve` (`approve`),
  KEY `allow_main` (`allow_main`),
  KEY `date` (`date`),
  KEY `symbol` (`symbol`),
  KEY `comm_num` (`comm_num`),
  KEY `tags` (`tags`),
  FULLTEXT KEY `short_story` (`short_story`,`full_story`,`xfields`,`title`)
) ENGINE=MyISAM /*!40101 DEFAULT CHARACTER SET cp1251_general_ci */


Есть запрос:
SELECT id, autor, date, short_story, SUBSTRING(full_story, 1, 15) as full_story, xfields, title, category, alt_name, comm_num, allow_comm, allow_rate, fixed, rating, vote_num, news_read, votes, flag, editdate, editor, reason, view_edit, tags
FROM dle_post
WHERE approve=1 AND allow_main=1
ORDER BY date DESC LIMIT 0,10


В таблице dle_post ~120 000 строк, и данный запрос выполняется больше 5-ти секунд (зависит от нагруженности MySQL) sad

Если отправить к примеру такой запрос:
SELECT id, autor, date, short_story, SUBSTRING(full_story, 1, 15) as full_story, xfields, title, category, alt_name, comm_num, allow_comm, allow_rate, fixed, rating, vote_num, news_read, votes, flag, editdate, editor, reason, view_edit, tags
FROM (SELECT * FROM dle_post LIMIT 0,100) AS sub_query
WHERE approve=1 AND allow_main=1
ORDER BY date DESC LIMIT 0,10

или просто убрать
WHERE approve=1 AND allow_main=1

в первом, то выполнятся они в доли секунды.
Так же если в первом запросе убрать LIMIT время выполнения не изменится.
Прихожу к выводу что в первом запросе WHERE проходит по всей таблице...

Пожалуйста подскажите как изменить запрос, чтобы WHERE находя 10 совпадений останавливался, если я правильно понял причину smile

Неактивен

 

#2 08.12.2011 00:36:08

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

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

Добавьте составной ключик на комбинацию (approve,allow_main,date) или (approve,allow_main,date), с ним должно шустрее работать.


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

Неактивен

 

Board footer

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