Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > что быстрее?


Автор: chiffa 12.6.2017, 15:54
Всем добрый день. Если задача получить последний номер заказ и прибавить к нему 1.

Подскажите, что будет выполняться быстрее.

Код

select order_num+1 from orders where user_id = 1 order by datetime desc limit 0, 1


или 

Код

select a.order_num+1 from orders a where a.user_id = 1 group by a.order_num order by a.order_num desc limit 0, 1


если исходить из того, что записей будет несколько миллионов

Автор: Akina 13.6.2017, 09:19
Запросы неэквивалентны. Сравнение не имеет смысла.

Автор: chiffa 13.6.2017, 09:22
Почему не имеет смысла? Цель запроса получить номер следующего заказа и я выбирается наиболее оптимальна методика для этого

Автор: Zloxa 13.6.2017, 10:05
Цитата(chiffa @  13.6.2017,  10:22 Найти цитируемый пост)
 Цель запроса получить номер следующего заказа 

Полагаю, при этом надо гарантировать его уникальность.
Полагаю, при этом работа ведется в конкурентной среде.

Код

create table sequence(id int not null primray key, current_val int not null);
insert into sequence values (1, 0);


Код

update sequence set current_val = last_insert_id(current_val+1) where id = 1;
select last_insert_id();



Akina, MyISAM при update накладывает блокировку на строку или на блок(как МС, например)?

Автор: Akina 13.6.2017, 12:00
Цитата(chiffa @  13.6.2017,  10:22 Найти цитируемый пост)
Почему не имеет смысла?

Потому что запросы НЕЭКВИВАЛЕНТНЫ!!! на одних и тех же исходных данных - могут вернуть РАЗНЫЕ данные.

Цитата(Zloxa @  13.6.2017,  11:05 Найти цитируемый пост)
MyISAM при update накладывает блокировку на строку или на блок(как МС, например)?

Locking granularity = Table.

Автор: Zloxa 13.6.2017, 17:10
Цитата(Akina @ 13.6.2017,  13:00)
Цитата(chiffa @  13.6.2017,  10:22 Найти цитируемый пост)
Почему не имеет смысла?

Потому что запросы НЕЭКВИВАЛЕНТНЫ!!! на одних и тех же исходных данных - могут вернуть РАЗНЫЕ данные.

Цитата(Zloxa @  13.6.2017,  11:05 Найти цитируемый пост)
MyISAM при update накладывает блокировку на строку или на блок(как МС, например)?

Locking granularity = Table.

Четр. Имел в виду InnoDB, которая с тразнзакции. Вечно их путаю. Сначаала написал MySQL, потом подумал что там от движка зависимо и решил уточнить про InnoDB, но вместо того написал MyISAM 
 smile  smile  smile 

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

Автор: Akina 14.6.2017, 10:07
Цитата(Zloxa @  13.6.2017,  18:10 Найти цитируемый пост)
Судя по всему InnoDB залочит именно строку, не блок.  

Да, Locking granularity = Row. Но в InnoDB все локи - индексные (даже если на таблице вообще нет индексов, всё равно существует синтетический кластерный индекс по внутреннему идентификатору записи), так что record lock порой на деле оказывается gap lock.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)