SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 12.02.2011 20:02:30

mordan
Завсегдатай
Зарегистрирован: 21.09.2009
Сообщений: 41

Как ускорить запросы?

Здравствуйте.
Подскажите пожалуйста как можно ускорить запросы и избавиться от Using temporary; Using filesort?

SELECT b.id, b.item, b.item_path, COUNT(DISTINCT p.goods_id) cnt FROM goods_brands b LEFT JOIN price p ON (p.brand_id = b.id) WHERE p.approved = 0 AND p.avaible = 1 AND p.category_id = 191 GROUP BY b.id ORDER BY b.item;


id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra
1    SIMPLE    p    ref    category_id,brand_id,avaible,bc,approved,approved_...    approved_2    12    const,const,const    1522    Using where; Using temporary; Using filesort
1    SIMPLE    b    eq_ref    PRIMARY    PRIMARY    4    freesell_new.p.brand_id    1    



SELECT p.id FROM price p LEFT JOIN goods_count gc ON (p.goods_id = gc.goods_id) WHERE (p.approved = 0) AND p.avaible = 1 AND (p.category_id = 191) ORDER BY gc.c_out_day DESC, price ASC, p_click DESC LIMIT 0, 300


id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra
1    SIMPLE    p    ref    category_id,avaible,approved,approved_3,approved_2    approved_2    12    const,const,const    1522    Using temporary; Using filesort
1    SIMPLE    gc    eq_ref    PRIMARY,id    PRIMARY    4    freesell_new.p.goods_id    1      


в этом запросе я выбираю 300 идишек потом делаю запрос с IN по этим идишникам и с сортировкой уже подготовленной по этим идишникам , верно ли решение ?

Отредактированно mordan (12.02.2011 20:04:51)

Неактивен

 

#2 14.02.2011 00:46:46

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

Re: Как ускорить запросы?

А ключик на goods_brands (id, item) есть?

Неактивен

 

#3 14.02.2011 09:14:26

mordan
Завсегдатай
Зарегистрирован: 21.09.2009
Сообщений: 41

Re: Как ускорить запросы?

сделал - но не помогло ...

Неактивен

 

#4 14.02.2011 10:11:46

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

Re: Как ускорить запросы?

Приведите SHOW CREATE TABLE используемых таблиц. И новый EXPLAIN

Неактивен

 

#5 14.02.2011 10:20:35

mordan
Завсегдатай
Зарегистрирован: 21.09.2009
Сообщений: 41

Re: Как ускорить запросы?

id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra
1    SIMPLE    p    ref    category_id,brand_id,avaible,bc,approved,approved_...    approved_2    12    const,const,const    3798    Using where; Using temporary; Using filesort
1    SIMPLE    b    eq_ref    PRIMARY,id    PRIMARY    4    freesell_new.p.brand_id    1    



goods_brands | CREATE TABLE `goods_brands` (
  `id` int(11) NOT NULL auto_increment,
  `parent_id` int(11) NOT NULL default '0',
  `item` varchar(255) NOT NULL default '',
  `item_path` varchar(255) NOT NULL default '',
  `dirt` tinyint(4) NOT NULL default '0',
  `official_site_url` varchar(255) NOT NULL,
  `sinonim` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `item` (`item`),
  KEY `item_path` (`item_path`),
  KEY `id` (`id`,`item`)
) ENGINE=MyISAM AUTO_INCREMENT=2433 DEFAULT CHARSET=cp1251



CREATE TABLE `price` (
  `id` int(11) NOT NULL auto_increment,
  `goods_id` int(11) NOT NULL default '0',
  `brand_id` int(11) NOT NULL default '0',
  `category_id` int(11) NOT NULL default '0',
  `user_id` int(10) unsigned NOT NULL default '0',
  `name` varchar(255) NOT NULL default '',
  `brand` varchar(32) NOT NULL default '',
  `description` text NOT NULL,
  `price` decimal(10,2) unsigned NOT NULL default '0.00',
  `price_grn` decimal(10,2) NOT NULL default '0.00',
  `opt_price` decimal(10,2) unsigned NOT NULL default '0.00',
  `garant` varchar(32) default NULL,
  `delivery` text NOT NULL,
  `url_pic` text NOT NULL,
  `url_basket` text NOT NULL,
  `url_description` text NOT NULL,
  `avaible` int(1) NOT NULL default '0',
  `date_update` date NOT NULL default '0000-00-00',
  `c_count` int(11) NOT NULL default '0',
  `indexing` tinyint(1) NOT NULL default '0',
  `hash` varchar(32) NOT NULL default '',
  `p_click` decimal(10,2) NOT NULL,
  `approved` int(1) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `user_id` (`user_id`),
  KEY `category_id` (`category_id`),
  KEY `goods_id` (`goods_id`),
  KEY `indexing` (`indexing`),
  KEY `brand_id` (`brand_id`),
  KEY `avaible` (`avaible`),
  KEY `price` (`price`),
  KEY `hash` (`hash`),
  KEY `user_id_2` (`user_id`,`category_id`,`avaible`),
  KEY `bc` (`brand_id`,`category_id`),
  KEY `approved` (`approved`,`goods_id`),
  KEY `approved_3` (`approved`,`avaible`,`brand_id`,`category_id`),
  KEY `price_grn` (`price_grn`),
  KEY `approved_2` (`approved`,`avaible`,`category_id`)
) ENGINE=InnoDB AUTO_INCREMENT=256463461 DEFAULT CHARSET=cp1251 |

Неактивен

 

#6 14.02.2011 10:28:10

mordan
Завсегдатай
Зарегистрирован: 21.09.2009
Сообщений: 41

Re: Как ускорить запросы?

ещё вопрос - в прошлом году , я заказывал у Вас оптимизацию, но так как была проблема с серверами, что то не получилось тогда оптимизировать хотя деньги я заплатил, возможно можно продолжить ?

Неактивен

 

#7 14.02.2011 10:39:44

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

Re: Как ускорить запросы?

Попробуйте добавить индекс KEY (`brand_id`,`approved`,`avaible`,`category_id`) и добавить STRAIGHT_JOIN к SELECT.
(SELECT STRAIGHT_JOIN ... *)

Второй запрос выглядит нормально.

Неактивен

 

#8 14.02.2011 10:46:45

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

Re: Как ускорить запросы?

mordan написал:

ещё вопрос - в прошлом году , я заказывал у Вас оптимизацию, но так как была проблема с серверами, что то не получилось тогда оптимизировать хотя деньги я заплатил, возможно можно продолжить ?

нашел Вас в базе клиентов, 20 марта прошлого года общались. Давайте продолжим, пишите на email.

Неактивен

 

#9 14.02.2011 11:25:32

mordan
Завсегдатай
Зарегистрирован: 21.09.2009
Сообщений: 41

Re: Как ускорить запросы?

id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra
1    SIMPLE    b    ALL    PRIMARY,id    NULL    NULL    NULL    2263    Using temporary; Using filesort
1    SIMPLE    p    ref    category_id,brand_id,avaible,bc,approved,approved_...    bc    8    freesell_new.b.id,const    16    Using where

Using temporary; Using filesort осталось - но запрос стал кешироваться и работать в 10 раз быстрее.

Неактивен

 

Board footer

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