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

Защо mysql удря индекс при обвиване на колона с функция за дата

Известно е, че докладът EXPLAIN е труден за тълкуване. Те са претоварили твърде много информация в няколко полета. Може да опитате

type: index показва, че извършва индексно сканиране , което означава, че посещава всеки запис в индекса.

Това посещава същия брой записи като сканиране на таблица, с изключение на това, че е спрямо вторичен индекс вместо групирания (основен) индекс.

Когато видим type: index , EXPLAIN показва possible_keys: NULL което означава, че не може да използва никакъв индекс за ефективно търсене. Но също така показва key: add_time което означава, че индексът, който използва за индексното сканиране, е add_time .

Индексното сканиране се дължи на факта, че MySQL не може сам да оптимизира изрази или извиквания на функции. Например, ако се опитате да търсите дати с конкретен месец, можете да търсите month(add_time) = 4 но това няма да използва индекса на add_time, защото датите с този месец са разпръснати в индекса, а не всички групирани заедно.

Може да знаете тази date(add_time) трябва да може да се търси по индекса, но MySQL не прави това заключение. MySQL просто вижда, че използвате функция, и дори не се опитва да използва индекса.

Ето защо MySQL 5.7 въведе генерирани колони за да ни позволи да индексираме израз, а MySQL 8.0 го направи още по-добър, като позволи индекс към определен за израз без да се изисква първо да дефинираме генерирана колона.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Изберете само редове, където съществуват точни множество връзки

  2. Индексът (на база нула) трябва да е по-голям или равен на нула

  3. Ефективно присвояване на процентил/ранг в MYSQL

  4. Как да генерирам динамично HTML страница с помощта на PHP?

  5. Как да получите идентификатор на елемент в PHP променлива