V zásadě musíte takové dotazy vkládat do uložených procedur kvůli určitým omezením na LIMIT . V prostém sql nemůžete použít dílčí výběry nebo proměnné. V uložených procedurách můžete použít proměnné.
Funguje to, bohužel to nemohu zobrazit v sqlfiddle protože se zdá, že mají omezenou podporu pro uložené procedury.
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();
Vypracování klastrovaných indexů InnoDB
Po diskusích v jedné z dalších odpovědí s @fthiella jsem se rozhodl upřesnit, jak to může fungovat.
Tabulka využívající InnoDB jako engine bude mít vždy seskupený index. Vždy. Je to způsob, jakým jsou data uložena v InnoDB a není v žádném případě možné vytvořit tabulku bez seskupeného indexu.
InnoDB vybere primární klíč, pokud existuje jeden nebo první jedinečný index se všemi sloupci nastavenými na hodnotu not null. Pokud takový index neexistuje, InnoDB vytvoří skrytý sloupec s ID řádku. Toto ID řádku funguje podobně jako automatický přírůstek a pokud to pomůže uvažovat o něm jako o neviditelném sloupci s automatickým přírůstkem, myslím, že je to v pořádku.
Dále InnoDB vrátí řádky podle použitého indexu. Vždy bude používat nějaký index (jediný způsob, jak získat data, je použít sekundární index, seskupený index nebo kombinaci), takže v případě, že neexistují žádné explicitně vytvořené indexy, jsou řádky vráceny skrytým seskupeným indexem.
To znamená, že dotaz na tabulku bez primárního klíče a jedinečných indexů se všemi sloupci nastavenými na hodnotu není null a bez ORDER BY vrátí řádky v pořadí, v jakém byly vloženy.
To je případ této otázky a základ mé a mnoha dalších odpovědí.
Nechci říct, že je to dobrý způsob práce s daty. Zde je několik věcí, které byste měli zvážit před použitím tohoto řešení:
- Pokud se někdy vytvoří index, který lze použít jako seskupený index, tabulka bude přepsána tak, aby používala tento index, a tak uspořádá data na disku. Pokud je index později zrušen, původní pořadí vložení je ztraceno a nelze jej načíst.
- Pokud je vytvořen index, i když není jedinečný, může jej zvolit optimalizátor, který se má použít, a řádky budou místo toho seřazeny podle tohoto indexu.
To vše je zdokumentováno a pro 5.5 je to 3. odrážka na tuto stránku