Почему запрос все еще такой быстрый, когда я оперирую неиндексированным столбцом? - PullRequest
0 голосов
/ 04 апреля 2019

Я изучаю индексацию базы данных.

здесь указатели таблицы. И эта таблица имеет 330 тыс. Записей.

mysql> show index from employee;
+----------+------------+-------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table    | Non_unique | Key_name    | Seq_in_index | Column_name   | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+----------+------------+-------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| employee |          0 | PRIMARY     |            1 | id            | A         |      297383 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| employee |          0 | ak_employee |            1 | personal_code | A         |      297383 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| employee |          1 | idx_email   |            1 | email         | A         |      297383 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
+----------+------------+-------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+

Как видите, в этой таблице только три индексации.

Теперь я хочу выполнить запрос к столбцу where в birth_date, я думаю, что он будет очень медленным, потому что нет индексации по столбцу birth-date, я при попытке запроса обнаружил, что он очень быстрый.

mysql> select sql_no_cache *
    -> from employee
    -> where birth_date > '1955-11-11'
    -> limit 100
    -> ;

100 rows in set, 1 warning (0.04 sec)

Так что я в замешательстве:

  • почему все еще так быстро без индексации?
  • из-за его высокой скорости, зачем нам все еще нужно индексирование?

1 Ответ

2 голосов
/ 04 апреля 2019

Это ваш запрос:

select sql_no_cache *
from employee
where birth_date > '1955-11-11'
limit 100

Нет индексов, поэтому запрос начинает читать данные со страниц данных.На каждой записи он сравнивает дату рождения и возвращает строку.Когда он находит 100 (из-за limit), он останавливается.

Предположительно, он находит 100 строк довольно быстро.В конце концов, средний возраст Соединенных Штатов составляет около 38 лет - это (как я сейчас пишу) год рождения 1981 года. Безусловно, большинство людей родились после 1955 года.

Запрос будет намногомедленнее, если у вас был order by или group by.Для этого потребуется прочитать все данные, прежде чем что-либо возвращать.

...