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

Оптимизирайте SELECT ... WHERE IN (...)

SELECT * FROM  products                         <<-- select * is non-optimal
WHERE  prodid in (10331,11639,12127..) 
ORDER BY Field(prodid, 10331,11639,12127...);   <<-- your problem is here

Първо поставете индекс на prodid вижте отговора на @Anthony.

След това променете заявката да чете:

SELECT only,the,fields,you,need FROM  products
WHERE  prodid in (10331,11639,12127..) 
ORDER BY prodid

Ако се уверите, че вашият IN списъкът се сортира възходящо, преди да се предложи на IN клауза, order by prodid ще даде същия резултат както order by field(...

  • Използването на функция вместо поле убива всяка възможност за използване на индекс, което води до забавяне.
  • select * ще извлече данни, които може да не са ви необходими, причинявайки допълнителен достъп до диск и допълнително използване на паметта и допълнителен мрежов трафик.
  • В InnoDB, ако само select индексирани полета, MySQL никога няма да прочете таблицата, а само времето за спестяване на индекс (във вашия случай обаче това вероятно не е проблем)

Има няколко трика, които можете да използвате.

  • Ако таблицата с продукти не е твърде голяма, можете да я направите memory таблица, която се съхранява в RAM. Не правете това за големи маси, това ще забави други неща.
    Можете да използвате само hash индекси на таблици с памет.
  • Ако prodid-ите са непрекъснати, можете да използвате BETWEEN 1000 AND 1019 вместо
    IN (1000, 1001 ..., 1019)


  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. Производителност на MySQL:Една или няколко таблици

  3. Как да създадете TRIGGER в SEQUELIZE (nodeJS)?

  4. Пребройте колко записа има в база данни на интервали от 5 минути

  5. Маркиране на клетка PHP с определен цвят въз основа на стойността на MYSQL