SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 23.10.2013 02:32:12

maxjoin
Завсегдатай
Зарегистрирован: 03.07.2008
Сообщений: 26

как быстро сделать выборку по запросу с order by last_update?

есть таблица с 10м записей
как можно быстро сделать выборку с сортировкой по order by last_update limit 1000?

last_update - TIMESTAMP

mysql>


EXPLAIN SELECT
  LOWER( HEX( `topics`.`hash` ) ) AS `hash` ,
  `topics`.`id` ,
  `topics`.`id_country` ,
  `topics`.`name` ,
  `topics`.`slug` ,
  `topics`.`keyword_es_must` ,
  `topics`.`keyword_es_should` ,
  `topics`.`tree` ,
  `topics`.`keyword_es_mustshould` ,
  `topics`.`meta_robots_index`
FROM `topics` FORCE INDEX ( `last_update` )
WHERE `topics`.`meta_robots_index` =1
AND `topics`.`meta_robots_archive` =1
AND `topics`.`meta_robots_follow` =1
AND `topics`.`is_category` =0
ORDER BY `topics`.`last_update` ASC
LIMIT 0 , 1000;
 

+----+-------------+--------+-------+---------------+-------------+---------+------+------+-------------+
| id | select_type | table  | type  | possible_keys | key         | key_len | ref  | rows | Extra       |
+----+-------------+--------+-------+---------------+-------------+---------+------+------+-------------+
|  1 | SIMPLE      | topics | index | NULL          | last_update | 4       | NULL |  1000 | Using where |
+----+-------------+--------+-------+---------------+-------------+---------+------+------+-------------+

Отредактированно maxjoin (23.10.2013 21:55:50)

Неактивен

 

#2 23.10.2013 02:45:04

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: как быстро сделать выборку по запросу с order by last_update?

Если LIMIT именно 0,1000, то должен быть быстрым в приведенном виде. Если начинается не с нуля, а с большого числа, то будет медленным. Ускорит только замена на SELECT topics.id FROM `topics` ..., а после получение id уже их использование для получения всего остального.

Неактивен

 

#3 23.10.2013 20:44:43

maxjoin
Завсегдатай
Зарегистрирован: 03.07.2008
Сообщений: 26

Re: как быстро сделать выборку по запросу с order by last_update?

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

explain select test.i from test, test t where test.i=5 and test.k=t.k order by t.k limit 5;


но думаю айди получить лучше всего будет, что скажете?

хотя нет у меня же там условия чтобы индекс были и другие

Отредактированно maxjoin (23.10.2013 21:56:14)

Неактивен

 

#4 23.10.2013 20:57:33

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

Re: как быстро сделать выборку по запросу с order by last_update?

Что-то ваш последний запрос вызывает недоумение. Зачем там вообще нужен join?

Неактивен

 

#5 23.10.2013 21:35:17

maxjoin
Завсегдатай
Зарегистрирован: 03.07.2008
Сообщений: 26

Re: как быстро сделать выборку по запросу с order by last_update?

vasya написал:

Что-то ваш последний запрос вызывает недоумение. Зачем там вообще нужен join?

нашел статьи

http://www.mysqlperformanceblog.com/200 … imization/
http://dba.stackexchange.com/questions/ … this-query
http://dba.stackexchange.com/questions/ … le-selects

но до конца пока не понял как правильно сделать запрос

что то не получается составить запрос, подскажите как  плз

Отредактированно maxjoin (23.10.2013 21:59:56)

Неактивен

 

#6 23.10.2013 22:06:08

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

Re: как быстро сделать выборку по запросу с order by last_update?

maxjoin написал:

но до конца пока не понял как правильно сделать запрос

что то не получается составить запрос, подскажите как  плз

А какой запрос вы хотите составить? (исходные данные и что этот запрос должен делать)

Неактивен

 

#7 23.10.2013 22:38:52

maxjoin
Завсегдатай
Зарегистрирован: 03.07.2008
Сообщений: 26

Re: как быстро сделать выборку по запросу с order by last_update?

vasya написал:

А какой запрос вы хотите составить? (исходные данные и что этот запрос должен делать)

есть таблица



CREATE TABLE IF NOT EXISTS `topics` (
  `id` int(9) NOT NULL AUTO_INCREMENT,
  `id_country` int(3) NOT NULL,
  `id_rule` int(5) NOT NULL,
  `id_spec_group` int(3) NOT NULL,
  `name` varchar(255) NOT NULL,
  `slug` varchar(255) NOT NULL,
  `hash` binary(16) NOT NULL COMMENT 'pattern id_country+slug',
  `tree` varchar(100) NOT NULL COMMENT 'id.id.id_current',
  `tree_parent` int(7) NOT NULL,
  `tree_last` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'if last - 1 else 0',
  `template` varchar(100) NOT NULL DEFAULT 'category',
  `keyword_es_must` varchar(255) NOT NULL,
  `keyword_es_should` varchar(255) NOT NULL,
  `meta_title` varchar(255) NOT NULL,
  `meta_description` varchar(255) NOT NULL,
  `meta_canonical` varchar(255) NOT NULL,
  `meta_redirect` varchar(255) NOT NULL,
  `meta_robots_index` tinyint(1) NOT NULL DEFAULT '0',
  `meta_robots_archive` tinyint(1) NOT NULL DEFAULT '0',
  `meta_robots_follow` tinyint(1) NOT NULL DEFAULT '0',
  `is_category` tinyint(1) NOT NULL DEFAULT '1',
  `is_major` tinyint(1) NOT NULL DEFAULT '0',
  `is_active` tinyint(1) NOT NULL DEFAULT '1',
  `last_update` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `mongo_id` varchar(100) NOT NULL COMMENT 'remove',
  `statistics` varchar(255) NOT NULL,
  `facets` mediumblob NOT NULL,
  `keyword_es_mustshould` varchar(100) NOT NULL,
  `mongo_spec_id` varchar(100) NOT NULL COMMENT 'remove',
  `mongo_spec_group_id` varchar(100) NOT NULL COMMENT 'remove',
  `mongo_path` text NOT NULL COMMENT 'remove',
  PRIMARY KEY (`id`),
  UNIQUE KEY `hash` (`hash`),
  KEY `mongo_id` (`mongo_id`),
  KEY `name` (`name`),
  KEY `tree` (`tree`),
  KEY `last_update` (`last_update`),
  KEY `slug` (`slug`),
  KEY `is_category` (`is_category`),
  KEY `keyword_es_must` (`keyword_es_must`),
  KEY `meta_robots_index` (`meta_robots_index`),
  KEY `meta_robots_archive` (`meta_robots_archive`),
  KEY `meta_robots_follow` (`meta_robots_follow`),
  KEY `tree_parent` (`tree_parent`),
  KEY `is_active` (`is_active`),
  KEY `id_rule` (`id_rule`),
  KEY `tree_last` (`tree_last`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 PACK_KEYS=0 AUTO_INCREMENT=17696348 ;


CREATE TABLE IF NOT EXISTS `rules` (
  `id` int(5) NOT NULL AUTO_INCREMENT,
  `description` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  `min_items` int(3) NOT NULL DEFAULT '999',
  `min_news` int(3) NOT NULL DEFAULT '999',
  `min_reviews` int(3) NOT NULL DEFAULT '999',
  `min_blogs` int(3) DEFAULT '999',
  `mongo_id` varchar(100) COLLATE utf8_unicode_ci NOT NULL COMMENT 'remove',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci PACK_KEYS=0 AUTO_INCREMENT=102 ;

 


и есть запрос


SELECT Lower(Hex(`topics`.`hash`)) AS `hash`,
       `topics`.`id`,
       `topics`.`id_country`,
       `topics`.`name`,
       `topics`.`slug`,
       `topics`.`keyword_es_must`,
       `topics`.`keyword_es_should`,
       `topics`.`tree`,
       `topics`.`keyword_es_mustshould`,
       `topics`.`meta_robots_index`,
       `rules`.`min_items`,
       `rules`.`min_news`,
       `rules`.`min_reviews`,
       `rules`.`min_blogs`
FROM   `topics`,
       `rules`
WHERE  `topics`.`id_rule` = `rules`.`id`
       AND `topics`.`meta_robots_index` = 0
       AND `topics`.`meta_robots_archive` = 0
       AND `topics`.`meta_robots_follow` = 0
       AND `topics`.`is_category` = 0
ORDER  BY `topics`.`last_update` ASC
LIMIT  0, 5000;

 


который тормозит при сортировке по дате, не получается составить так запрос чтобы он не тормозил по дате

Неактивен

 

#8 23.10.2013 22:54:06

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

Re: как быстро сделать выборку по запросу с order by last_update?

попробуйте составной индекс, вначале наиболее селективные поля.

Неактивен

 

#9 23.10.2013 23:37:44

maxjoin
Завсегдатай
Зарегистрирован: 03.07.2008
Сообщений: 26

Re: как быстро сделать выборку по запросу с order by last_update?

vasya написал:

попробуйте составной индекс, вначале наиболее селективные поля.

не понял вас

Неактивен

 

#10 23.10.2013 23:48:07

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

Re: как быстро сделать выборку по запросу с order by last_update?

самое начало указанной вами статьи http://www.mysqlperformanceblog.com/200 … imization/

(`meta_robots_index`, `meta_robots_archive`, `meta_robots_follow`, `is_category`, `last_update`)

`meta_robots_index`, `meta_robots_archive`, `meta_robots_follow`, `is_category` - располагать в порядке уменьшения их селективности

Неактивен

 

Board footer

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