SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 10.05.2015 03:58:36

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

Медленная выборка из таблицы в 4 миллиона записей

Ребята помогите решить задачу, в таблице 4 миллиона записей, при выполнении запроса:

SELECT SQL_CACHE 9 AS test,N.*,
               (SELECT NAME FROM news_regions where id = N.id_region) AS region,
               (SELECT NAME FROM news_category where id = N.id_category) AS category,
               (SELECT NAME FROM news_sources where id = N.id_source) AS source
               FROM news_news N
                WHERE 1=1
                   AND MONTH(N.date) = 1  AND YEAR(N.date) = 2014
                   ORDER BY N.id DESC
                   LIMIT 0,36;


думает очень долго - Отображает строки 0 - 29 (36 всего, запрос занял 2.9451 сек.)

можно в принципе чуть упростить убрав сортировку ORDER BY N.id DESC но тогда понятное дело вывод будет не тот, что нужен, может кто что придумает, у меня сейчас башка совсем не варит, сижу мучаюсь только.

ниже приведу всю таблицу

CREATE TABLE IF NOT EXISTS `news_news` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `tid` INT(11) NOT NULL DEFAULT '0',
  `id_category` INT(11) NOT NULL DEFAULT '0',
  `id_source` INT(11) NOT NULL DEFAULT '1',
  `id_region` INT(11) NOT NULL DEFAULT '1',
  `date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `title` VARCHAR(255) NOT NULL DEFAULT '',
  `text` longtext NOT NULL,
  `link` VARCHAR(255) NOT NULL DEFAULT '',
  `image` VARCHAR(255) NOT NULL,
  `counter` INT(11) NOT NULL DEFAULT '0',
  `comment` INT(11) NOT NULL DEFAULT '0',
  `seo_title` VARCHAR(255) NOT NULL,
  `user_id` INT(11) NOT NULL,
  `poll` INT(11) NOT NULL DEFAULT '0',
  `hits` INT(11) NOT NULL DEFAULT '0',
  PRIMARY KEY  (`id`),
  KEY `id_region_id_category_id_source` (`id_region`,`id_category`,`id_source`),
  KEY `id_category` (`id_category`),
  KEY `image` (`image`),
  KEY `category_image` (`id_category`,`image`),
  KEY `id_region` (`id_region`),
  KEY `date` (`date`),
  KEY `id_source` (`id_source`),
  KEY `counter` (`counter`),
  KEY `region_category` (`id_category`,`id_region`),
  KEY `category_date_source` (`id_category`,`date`,`id_source`),
  KEY `link` (`link`),
  KEY `region_category_source_date` (`id_region`,`id_category`,`id_source`,`date`),
  KEY `regi2` (`id_region`,`id_category`,`date`),
  KEY `source_region` (`id_source`,`id_region`),
  KEY `user_id` (`user_id`),
  KEY `hits` (`hits`),
  KEY `counter_cat` (`id_category`,`counter`),
  FULLTEXT KEY `FULLTEXT` (`text`,`title`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=4824896 ;

Отредактированно newsrbk (10.05.2015 04:33:05)

Неактивен

 

#2 10.05.2015 04:51:14

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Медленная выборка из таблицы в 4 миллиона записей

AND MONTH(N.date) = 1  AND YEAR(N.date) = 2014

ваш запрос не использует индекс. попробуйте
       N.date between '2014-01-01 00:00:00' and '2014-02-01 00:00:00'

ну и план не забывайте показывать, если не поможет

Неактивен

 

#3 10.05.2015 10:48:21

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

Re: Медленная выборка из таблицы в 4 миллиона записей

vasya написал:

AND MONTH(N.date) = 1  AND YEAR(N.date) = 2014

ваш запрос не использует индекс. попробуйте
       N.date between '2014-01-01 00:00:00' and '2014-02-01 00:00:00'

ну и план не забывайте показывать, если не поможет

спасибо, да действительно намного быстрее стало

Отображает строки 0 - 29 (36 всего, запрос занял 0.0227 сек.)

Неактивен

 

#4 10.05.2015 14:03:14

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Медленная выборка из таблицы в 4 миллиона записей

Ok. Посмотрите ещё FAQ №5 и удалите лишние ключи (например, KEY `id_category` (`id_category`) не нужен при наличии    KEY `category_image` (`id_category`,`image`) и т.д).
Ну и * в запросе плохая практика.

Неактивен

 

Board footer

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