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

MySQL заявката е по-бавна след създаване на индекс

Реалистично ли е да има толкова много редове с една и съща price ? Реалистично ли е да се върнат 444K реда от заявка? Питам ги, защото оптимизацията на заявките се основава на „нормални“ данни.

Индекс (напр. INDEX(price)). ) е полезно, когато търсите price което се случва малък брой пъти. Всъщност оптимизаторът избягва индекса, ако види, че търсената стойност се среща повече от около 20% от времето. Вместо това просто ще игнорира индекса и ще направи това, което сте тествали първо – просто ще сканира цялата таблица, игнорирайки всички редове, които не съвпадат.

Трябва да можете да видите това, като направите

EXPLAIN select * from books where price = 10

със и без индекса. Като алтернатива можете да опитате:

EXPLAIN select * from books IGNORE INDEX(books_price_index) where price = 10
EXPLAIN select * from books FORCE INDEX(books_price_index) where price = 10

Но... Изглежда, че оптимизаторът не е пренебрегнал индекса. Виждам, че "кардиналността" на price е "1", което означава, че има само една отделна стойност в тази колона. Тази „статистика“ е или неправилна, или подвеждаща. Моля, стартирайте това и вижте какво се променя:

ANALYZE TABLE books;

Това ще преизчисли статистиката чрез няколко произволни проби и може променете това "1" на може би "2".

Общ съвет:Пазете се от сравнителни показатели, които работят с измислени данни.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Присъединете няколко колони от една таблица към една колона от друга таблица

  2. Вмъкването на стойност NOW() в тип данни за дата и час връща 0000-00-00 00:00:00

  3. Как да коригирате java.sql.SQLException:Колона „id“ не е намерена. грешка в Spring Boot

  4. Красноречив laravel WhereIn All

  5. Как да заменя оператор OR с оператор UNION?