Mysql
 sql >> база данни >  >> RDS >> Mysql

Как мога да избера всички записи с изключение на първите 3 записа?

По принцип трябва да поставите такива заявки в запазени процедури поради някои ограничения на 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-тата точка в тази страница



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Оптимизиране на MySQL заявка за търсене в целочислен диапазон

  2. Изтрийте от множество таблици, като използвате поръчка по и лимит

  3. Направете PHP/MySQL Timestamp да изглежда по-привлекателен

  4. Грешка при хибернация при запазване на типа данни TEXT

  5. NodeJS/mySQL - ER_ACCESS_DENIED_ERROR Достъпът е отказан за потребител 'root'@'localhost' (използвайки парола:ДА)