SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 02.12.2010 16:20:31

russssss
Участник
Зарегистрирован: 02.12.2010
Сообщений: 9

Не тот ключ выбирает join, не идет выбор по ключу

Добрый день!

У меня 2 таблицы

Первая, Storage: id | points | name,  ключи по id, id+points, points+id

Вторая, Group: pid | number,  ключи по pid, pid+number, number+pid

Записей в первой за 500 000, во второй около 3 000 000

Ищу запросом:

SELECT A.* FROM Storage AS A

JOIN Group AS  B
ON  A.id=B.pid

WHERE B.number=4 ORDER BY A.points DESC LIMIT 10


В ответ EXPLAIN пишет, что использует для поиска ключ id т.е. сортирует в запросе, вместо того, чтобы использовать ключ points+id, Почему?
Просто выборка между, допустим, id>10 and id<1000 order by points desc из первой таблички идет по ключу points+id как мне и надо.

Уже борода отросла пока бьюсь с этой делемой. Я в шоке. Спасите помогите.

Неактивен

 

#2 02.12.2010 16:31:34

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

Re: Не тот ключ выбирает join, не идет выбор по ключу

Просто в одном случае вы выбираете из одной таблицы, а в другом из двух smile

Вероятно (план запроса вы не привели) объединение идет с таблицы B и по значению pid ищется соответствующий id в таблице A, естественно используя индекс по id.

Неактивен

 

#3 02.12.2010 17:29:53

russssss
Участник
Зарегистрирован: 02.12.2010
Сообщений: 9

Re: Не тот ключ выбирает join, не идет выбор по ключу

Таблица A

CREATE TABLE `aaa_storage` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `points` INT(11) NOT NULL,
  `name` VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY  (`id`),
  KEY `ind_id_points` (`id`,`points`),
  KEY `ind_points_id` (`points`,`id`)
) ENGINE=INNODB AUTO_INCREMENT=10 DEFAULT CHARSET=cp1251


Таблица B

CREATE TABLE `aaa_group` (
  `pid` INT(11) NOT NULL,
  `number` INT(11) NOT NULL,
  KEY `ind_pid` (`pid`),
  KEY `ind_number` (`number`)
) ENGINE=INNODB DEFAULT CHARSET=cp1251



Запрос:

EXPLAIN

SELECT A.* FROM `aaa_storage` AS A

JOIN `aaa_group` AS B
ON A.id=B.pid


WHERE B.number=55  ORDER BY A.points DESC LIMIT 10


Выдает:

id    select_type    table    type    possible_keys    key    key_len    ref    rows    Extra
1    SIMPLE    B    ref    ind_pid,ind_number    ind_number    4    const    5    Using temporary; Using filesort
1    SIMPLE    A    eq_ref    PRIMARY,ind_id_points    PRIMARY    4    bd.B.pid    1

Отредактированно russssss (02.12.2010 17:31:46)

Неактивен

 

#4 02.12.2010 18:52:55

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

Re: Не тот ключ выбирает join, не идет выбор по ключу

Всё происходит именно так, как я и предположил в прошлом посте.

Неактивен

 

#5 02.12.2010 19:08:21

russssss
Участник
Зарегистрирован: 02.12.2010
Сообщений: 9

Re: Не тот ключ выбирает join, не идет выбор по ключу

Пожалуйста помогите построить запрос так, чтобы использовался ключ ind_points_id (ind_id_points ?). Мне нужно обращаясь к таблице B по number получать записи из A с самым высокими points. Спасибо!

Неактивен

 

#6 02.12.2010 19:35:08

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

Re: Не тот ключ выбирает join, не идет выбор по ключу

Вы можете использовать IGNORE INDEX, USE INDEX и FORCE INDEX, чтобы указать оптимизатору какие индексы использовать
http://sqlinfo.ru/forum/viewtopic.php?id=231

Только зачем?
Заставив MySQL, использовать:
-)  KEY (`id`,`points`) вы ничего не измените. Просто вместо индекса по id будет использоваться левая часть индекса (`id`,`points`).
-)  KEY (`points`,`id`) вы существенно замедлите выполнение запроса.

Неактивен

 

#7 02.12.2010 19:53:27

russssss
Участник
Зарегистрирован: 02.12.2010
Сообщений: 9

Re: Не тот ключ выбирает join, не идет выбор по ключу

Я перепробовал USE INDEX и FORCE INDEX, STRAIGHT_JOIN все это очень медленно. Второй день бьюсь с запросом. Должно же быть решение?

Неактивен

 

#8 02.12.2010 20:00:30

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

Re: Не тот ключ выбирает join, не идет выбор по ключу

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

Представьте, что вы сервер MySQL smile
У вас есть тетрадь на обложке которой написано "Таблица А". На первой странице в 3 колонки id, points, name записаны данные в порядке их добавления в тетрадь. На второй странице те же данные отсортированные по id - это индекс по id. На третьей странице данные отсортированы по id и points - это   KEY `ind_id_points` (`id`,`points`). И так далее.
Аналогично вторая тетрадь для таблицы В.
Кроме того у вас есть ручка/карандаш и черновик - temporary table.

Теперь вы хотите выполнить ваш запрос. Порядок ваших действий?

Неактивен

 

#9 02.12.2010 20:24:11

russssss
Участник
Зарегистрирован: 02.12.2010
Сообщений: 9

Re: Не тот ключ выбирает join, не идет выбор по ключу

Я сейчас не мускул, а бородатый красноглаз, ничего не соображаю, спасибо за помощь, завтра напишу вопросы, если не решу. А сейчас только пиво.

Неактивен

 

Board footer

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