Задавайте вопросы, мы ответим
Вы не зашли.
Страниц: 1
Добрый день!
У меня 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 как мне и надо.
Уже борода отросла пока бьюсь с этой делемой. Я в шоке. Спасите помогите.
Неактивен
Просто в одном случае вы выбираете из одной таблицы, а в другом из двух
Вероятно (план запроса вы не привели) объединение идет с таблицы B и по значению pid ищется соответствующий id в таблице A, естественно используя индекс по id.
Неактивен
Таблица 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)
Неактивен
Всё происходит именно так, как я и предположил в прошлом посте.
Неактивен
Пожалуйста помогите построить запрос так, чтобы использовался ключ ind_points_id (ind_id_points ?). Мне нужно обращаясь к таблице B по number получать записи из A с самым высокими points. Спасибо!
Неактивен
Вы можете использовать IGNORE INDEX, USE INDEX и FORCE INDEX, чтобы указать оптимизатору какие индексы использовать
http://sqlinfo.ru/forum/viewtopic.php?id=231
Только зачем?
Заставив MySQL, использовать:
-) KEY (`id`,`points`) вы ничего не измените. Просто вместо индекса по id будет использоваться левая часть индекса (`id`,`points`).
-) KEY (`points`,`id`) вы существенно замедлите выполнение запроса.
Неактивен
Я перепробовал USE INDEX и FORCE INDEX, STRAIGHT_JOIN все это очень медленно. Второй день бьюсь с запросом. Должно же быть решение?
Неактивен
У вас очень странные представления об индексе, как о некой волшебной кнопке, нажав на которую, вы получаете результат.
Представьте, что вы сервер MySQL
У вас есть тетрадь на обложке которой написано "Таблица А". На первой странице в 3 колонки id, points, name записаны данные в порядке их добавления в тетрадь. На второй странице те же данные отсортированные по id - это индекс по id. На третьей странице данные отсортированы по id и points - это KEY `ind_id_points` (`id`,`points`). И так далее.
Аналогично вторая тетрадь для таблицы В.
Кроме того у вас есть ручка/карандаш и черновик - temporary table.
Теперь вы хотите выполнить ваш запрос. Порядок ваших действий?
Неактивен
Я сейчас не мускул, а бородатый красноглаз, ничего не соображаю, спасибо за помощь, завтра напишу вопросы, если не решу. А сейчас только пиво.
Неактивен
Страниц: 1