WedX - журнал о программировании и компьютерных науках

Ограничение MySQL 1 возвращает последнюю запись результирующего набора порядка?

1. Я создаю таблицу

create table sort (
 a int,
 b int,
primary key (a));

2. Затем я вставил три записи

insert into sort values(1, 10), (2, 10), (3, 10);

3. Когда я выбираю использовать этот sql

select * from sort order by b;

Это дает такой результат

+---+------+
| a | b    |
+---+------+
| 1 |   10 |
| 2 |   10 |
| 3 |   10 |
+---+------+
  1. Когда я выбираю таблицу, используйте этот запрос

    выберите * из порядка сортировки по b limit 1;

И набор результатов такой

+---+------+
| a | b    |
+---+------+
| 3 |   10 |
+---+------+

И это не то, что я исключал (я думал, что возврат первой записи будет разумным).

Моя версия mysql - Ver 14.14 Distrib 5.6.23, для osx10.8 (x86_64)

Кто-нибудь может мне это объяснить? Спасибо.

13.10.2015

  • почему он должен вернуть первый? вы упорядочиваете по столбцу «B», столбец «A» не имеет значения, MySQL будет хранить данные в файлах не так, как вы видите в графическом интерфейсе, он сортирует таблицу и захватывает столбец с наименьшим значением «B», есть ли ряд с нижней буквой «B»? нет, это означает, что запрос правильный, если вы хотите, чтобы первая строка была возвращена, добавьте порядок b, a 13.10.2015
  • Интересный. Я попробовал это (используя innodb и myisam, если это имело значение) и в результате получил первую строку (a = 1) с ограничением 1 (как вы и ожидали). 13.10.2015
  • @ogres добавьте это в качестве ответа 13.10.2015
  • Это еще не объяснение. Конечно, нет ничего плохого в том, что mysql возвращает любую из трех строк, но я, например, предпочел бы фактическое объяснение поведения. Я пытался повторить это, и я не могу. 13.10.2015
  • вы ожидаете этого order by b asc or desc 13.10.2015

Ответы:


1

Это потому, что когда вы вводите select * from sort order by b;, это загружается со скрытым полем ACS. Это означает запросить загрузку всей даты в порядке возрастания.

+---+------+
| a |   b  |
+---+------+
| 1 |  10  |
| 2 |  10  |
| 3 |  10  |
+---+------+

Но если вы используете select * from sort order by b limit 1;, он снова загружает данные с помощью ACS, и тогда у вас есть условие с LIMIT 1. Итак, в столбце b все 10, поэтому он загрузит последнее добавленное значение этого.

Bz MySQL решит, что последняя добавленная строка является самой новой.

13.10.2015

2

Я не могу на самом деле объяснить поведение, потому что я не могу воспроизвести его. Но я могу продемонстрировать, что то, что ожидал OP, - это то, как работает мой mysql (Ver 14.14 Distrib 5.5.44, для debian-linux-gnu (i686)) [NB, я вставляю записи в другом порядке, чтобы доказать свою точку зрения ):

Во-первых, без первичного ключа:

mysql> create table sort (
    ->  a int,
    ->  b int);
mysql> insert into sort values (3,10),(2,10), (1,10);
mysql> select * from sort order by b limit 1;
+------+------+
| a    | b    |
+------+------+
|    3 |   10 |
+------+------+

Отображается первая вставленная запись

И с первичным ключом:

mysql> create table sort (
    ->  a int,
    ->  b int,
    -> primary key (a));
mysql> insert into sort values (3,10),(2,10), (1,10);
mysql> select * from sort order by b limit 1;
+---+------+
| a | b    |
+---+------+
| 1 |   10 |
+---+------+

Это таблица myisam (по умолчанию на моем сервере), поэтому таблица имеет кластеризованный индекс, что приводит к чтению таблицы в порядке столбца a. Следовательно, a=1 - первая запись (я полагаю).

Наконец, используя innodb:

mysql> create table sort (  a int,  b int, primary key (a) ) engine=myisam;
mysql> insert into sort values (3,10),(2,10), (1,10);
mysql> select * from sort order by b limit 1;
+---+------+
| a | b    |
+---+------+
| 3 |   10 |
+---+------+

Нет кластеризованного индекса, поэтому возвращается первая введенная запись.

Ничто из этого не объясняет, что утверждает ОП, но я не могу заставить это произойти.

13.10.2015
  • первичный ключ таблицы innodb не является кластеризованным индексом? 13.10.2015
  • Первичный ключ таблицы myisam не является кластеризованным индексом. Вот почему примеры myisam и innodb различаются (я думаю). 13.10.2015

  • 3

    Этот SQL Server уже вернул разумную запись. Потому что вы заказываете по столбцу с одинаковым количеством (оценка по сервису).

    Шаг, который делает SQL Server: ::

    Проверка наличия индексации -> Чтение таблицы с диска/индекса -> Сортировка данных -> Получение n числа отсортированных данных.

    (n из вашего запроса)

    Итак, этот SQL Server вернет первое, что он нашел в основной таблице с диска (Хранилище), потому что вы не проиндексировали его.



    Если вы не заказываете по а, б.
    Вы получите результат 1,10.

    Или создайте индекс, который изменит порядок ваших данных. (Вы также можете получить в результате 2,10)
    В противном случае вы получите первые вставленные данные на диск в качестве результатов.

    13.10.2015
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]