По принцип трябва да поставите такива заявки в запазени процедури поради някои ограничения на LIMIT . Не можете да използвате подизбирания или променливи в обикновен sql. В съхранените процедури можете да използвате променливи.
Това работи, за съжаление не мога да го покажа в sqlfiddle защото изглежда, че имат ограничена поддръжка за съхранени процедури.
drop procedure if exists all_but_3;
delimiter //
create procedure all_but_3()
begin
declare v_max bigint unsigned default ~0;
select * from your_table limit 3, v_max;
end//
delimiter ;
drop procedure if exists last_3;
delimiter //
create procedure last_3()
begin
declare v_max bigint;
declare v_mid bigint;
select count(*) from your_table into v_max;
set v_mid := v_max - 3;
select * from your_table limit v_mid, v_max;
end//
delimiter ;
call all_but_3();
call last_3();
Разработка на клъстерирани индекси на InnoDB
След дискусии в един от другите отговори с @fthiella реших да разясня по-подробно как това може да работи.
Таблица, използваща InnoDB като машина, винаги ще има клъстериран индекс. Винаги. Това е начинът, по който данните се съхраняват в InnoDB и по никакъв начин не е възможно да се създаде таблица без клъстериран индекс.
InnoDB ще избере първичния ключ, ако има един или първият уникален индекс с всички колони, които не са нулеви. Ако такъв индекс не съществува, InnoDB ще създаде скрита колона с идентификатор на ред. Този идентификатор на ред работи подобно на автоматичното увеличение и ако помага да се мисли за него като за невидима колона с автоматично увеличение, мисля, че е добре.
По-нататък InnoDB ще върне редове според използвания индекс. Той винаги ще използва някакъв индекс (единственият начин за извличане на данни е да се използва или вторичен индекс, клъстериран индекс или комбинация), така че в случай, когато няма изрично създадени индекси, редовете се връщат от скрития клъстериран индекс.
Това означава, че заявка към таблица без първичен ключ и без уникални индекси с всички колони, които не са нулеви и без ORDER BY ще върне редове в реда, в който са били вмъкнати.
Това е случаят с този въпрос и основата за моя и много други отговори.
Не искам да кажа, че това е добър начин за работа с данните. Ето някои неща, за които трябва да помислите, преди да използвате това решение:
- Ако някога бъде създаден индекс, който може да се използва като клъстериран индекс, таблицата ще бъде пренаписана, за да използва този индекс и по този начин да подреди данните на диска. Ако индексът бъде изпуснат по-късно, оригиналният ред за вмъкване се губи и не може да бъде извлечен.
- Ако бъде създаден индекс, дори и да не е уникален, той може да бъде избран от оптимизатора да се използва и вместо това редовете ще бъдат подредени по този индекс.
Всичко това е документирано и за 5.5 това е 3-тата точка в тази страница