Есть ли способ выбрать максимальный идентификатор строки в MySQL без сканирования всех строк с помощью MAX ()? - PullRequest
0 голосов
/ 18 декабря 2010

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

SELECT MAX(id) FROM table WHERE groupID = '12345'

Ответы [ 4 ]

1 голос
/ 20 декабря 2010

Уродливое решение - добавить индекс на groupID, id

alter table `table` add index groupId_with_id_idx (groupId, id);
desc SELECT MAX(id) FROM table use index (groupId_with_id_idx) WHERE groupID=12345;
/* the execution plan should return "Select tables optimized away" */

Что такое оптимизированные таблицы Select?

0 голосов
/ 18 декабря 2010

Альтернативный запрос

SELECT * FROM table WHERE groupID = '12345' ORDER BY id DESC LIMIT 1;
0 голосов
/ 18 декабря 2010

Я считаю, что было бы быстрее выровнять ORDER BY id и выбрать вхождение LIMIT 1 для groupid, но MySQL не может использовать индекс, когда вы упорядочиваете по ключу и выбираете другой постоянный ключ, потому что он все еще читает каждую строку.

Если вы используете ORIDER BY groupid (asc или desc), всегда ли первая или последняя запись в этом groupid является самым высоким идентификатором?Тогда вашим самым быстрым запросом будет упорядочить по groupid и выбрать LIMIT 1 для первой записи, указанной в этом groupid.

0 голосов
/ 18 декабря 2010

Если столбец является столбцом идентификаторов AutoNumber, вы можете сделать что-то вроде:

 IDENT_CURRENT('table')

Но это может быть удар или пропуск.Если вы используете его где, я сомневаюсь, что он даст вам то, что вы хотите.

Приветствия,

...