MySQL min () поведение в Innodb

String a = new String("foo");
String b = new String("foo");
System.out.println(a == b); // prints false
System.out.println(a.equals(b)); // prints true

Убедитесь, что вы понимаете, почему. Это потому, что сравнение == сравнивает только ссылки; equals() метод сопоставляет содержимое по символу.

Когда вы вызываете new для a и b, каждый получает новую ссылку, указывающую на "foo" в таблице строк. Ссылки разные, но контент один и тот же.

0
задан Bill Karwin 4 March 2019 в 17:12
поделиться

1 ответ

Прочитайте https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html о согласованных чтениях в InnoDB. Каждый оператор SELECT гарантирует просмотр своего рода «снимка» данных, который не изменится, пока выполняется оператор SELECT.

Итак, вы правы, у вас есть риск, что оператор SELECT вернет значение для MIN(x), которого не будет после того, как ваш оператор SELECT выполнен, потому что он был удален за это время.

Это цена, которую мы платим за свободу выполнять запросы на чтение, не блокируя одновременные обновления / удаления.

Кстати, если вы хотите, чтобы MIN(x) быстро возвращался, создайте индекс с x в качестве первого столбца.

0
ответ дан Bill Karwin 4 March 2019 в 17:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: