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

MySQL:Защо 5-ти идентификатор в клаузата IN драстично променя плана на заявката?

Както показахте, MySQL има два алтернативни плана за заявки за заявки с ORDER BY ... LIMIT n :

  1. Прочетете всички отговарящи на условията редове, сортирайте ги и изберете n горни редове.
  2. Прочетете редовете в сортиран ред и спрете, когато n бяха открити отговарящи на изискванията редове.

За да реши кой е по-добрият вариант, оптимизаторът трябва да оцени ефекта на филтриране на вашето WHERE условие. Това не е директно, особено за колони, които не са индексирани, или за колони, където стойностите са корелирани. Във вашия случай вероятно трябва да се прочете много повече от таблицата в сортиран ред, за да се намерят първите 25 отговарящи на изискванията реда, отколкото е очаквал оптимизаторът.

Има няколко подобрения в начина, по който се обработват LIMIT заявки, както в по-късни версии на 5.6 (работите на версия преди GA!), така и в по-нови версии (5.7, 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. sqljocky синхронно запитване към база данни

  2. Как да подадете няколко колони към променлива в php

  3. MySQL - Рекурсивна дървовидна структура

  4. ИЗБЕРЕТЕ най-новия запис с ненулева стойност в една колона

  5. Актуализирайте колоните, ако входните стойности не са нулеви, в противен случай игнорирайте и запазете съществуващите стойности на колоната в базата данни