SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 16.04.2010 11:14:33

igor_tp
Участник
Зарегистрирован: 16.04.2010
Сообщений: 3

Подскажите с расстановкой индексов

Вот запрос:

SELECT s.id,s.name,u.img,u.siteusername
          FROM sift_sifts as s
          INNER JOIN sift_rus_siteusers as u ON (u.id=s.user_id AND u.active=1)
          WHERE s.active=1 ORDER BY s.create_time LIMIT 0,10



Умные люди! Скажите реально ли выполнять такой запрос, чтобы MySQL не использовал Using temporary; Using filesort. Перебирал разные комбинации индексов, но без толку (может из-за отсутствия в MySQL создавать индексы на полях из разных таблиц?).

И еще такой вопрос - MySQL выдерет пользователей (таблица sift_rus_siteusers) только для 10 записей с учетом LIMIT или пробежит по целой выборке?

Структуру таблиц приводить не буду - она достаточно большая, да и вопрос больше для ознакомления.

Неактивен

 

#2 16.04.2010 13:13:21

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

Re: Подскажите с расстановкой индексов

Реально. Структуру ответа приводить не буду, т.к. он достаточно большой.
Ответ больше для ознакомления smile

Либо задавайте вопрос, либо нет, промежуточного не бывает. Тут я бы
убрал условие u.active в WHERE, где ему полагается быть, после этого Вы
бы увидели, что хватит индексов на s(active,create_time) и u(id,active).

Неактивен

 

#3 16.04.2010 13:41:04

igor_tp
Участник
Зарегистрирован: 16.04.2010
Сообщений: 3

Re: Подскажите с расстановкой индексов

paulus написал:

Реально. Структуру ответа приводить не буду, т.к. он достаточно большой.
Ответ больше для ознакомления smile

Либо задавайте вопрос, либо нет, промежуточного не бывает. Тут я бы
убрал условие u.active в WHERE, где ему полагается быть, после этого Вы
бы увидели, что хватит индексов на s(active,create_time) и u(id,active).

Переписал запрос EXPLAIN SELECT s.id, s.name, u.img, u.siteusername
FROM sift_sifts AS s
USE INDEX ( active )
INNER JOIN sift_rus_siteusers AS u
USE INDEX ( id ) ON ( u.id = s.user_id )
WHERE s.active =1
AND u.active =1
ORDER BY s.create_time
LIMIT 0 , 10

Индекс id (id,active) для таблицы u. Индекс active(active,create_time) EXPLAIN не поправился(

id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra
1     SIMPLE     s     ref     active     active     1     const     15     Using temporary; Using filesort
1     SIMPLE     u     ALL     id     NULL     NULL     NULL     4     Using where; Using join buffer

Зачем здесь всю таблицу приводить? Что изменится? s.user_id и u.id  mediumint(11)

Неактивен

 

#4 16.04.2010 14:09:21

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

Re: Подскажите с расстановкой индексов

Затем, что полная картина помогает решить проблему. Кусочки мозаики
позволяют мне додумывать не так, как у Вас. Например, у меня работает:

[celestia] root test > show create table sift_rus_siteusers\G
*************************** 1. row ***************************
       Table: sift_rus_siteusers
Create Table: CREATE TABLE `sift_rus_siteusers` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `active` tinyint(4) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

[celestia] root test > show create table sift_sifts\G
*************************** 1. row ***************************
       Table: sift_sifts
Create Table: CREATE TABLE `sift_sifts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `active` tinyint(4) NOT NULL,
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `active` (`active`,`create_time`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

[celestia] root test > EXPLAIN SELECT s.id FROM sift_sifts AS s FORCE INDEX(active) INNER JOIN sift_rus_siteusers AS u ON ( u.id = s.user_id ) WHERE s.active =1 AND u.active =1 ORDER BY s.create_time LIMIT 0 , 10;
+----+-------------+-------+------+---------------+--------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key    | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+--------+---------+-------+------+-------------+
|  1 | SIMPLE      | s     | ref  | active        | active | 1       | const |    2 | Using where |
|  1 | SIMPLE      | u     | ALL  | PRIMARY       | NULL   | NULL    | NULL  |    3 | Using where |
+----+-------------+-------+------+---------------+--------+---------+-------+------+-------------+
2 rows in set (0.00 sec)

Неактивен

 

#5 16.04.2010 14:16:29

igor_tp
Участник
Зарегистрирован: 16.04.2010
Сообщений: 3

Re: Подскажите с расстановкой индексов

Спасибо, paulus. Оказывается все дело было в недостаточном количестве записей. Просто когда их было мало с самого начала - все было ок, когда их стало чуть больше стала появляться искомая проблема, а когда их стало много (вручную загонял) все стало опять как надо. Я не подумал, не думал что от количества данных (может и от них самих) EXPLAIN может отличаться.

Неактивен

 

Board footer

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