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

Mysql прави една и съща заявка с втори индекс, без да получава 10000xFetch време?

OR UPPER(lu.opis) LIKE UPPER('%SomeName%')

има 3 проблема с производителността:

  • OR е лошо оптимизиран. По същество таблицата трябва да се сканира, за да се проверят всички редове. Индексите едва ли ще помогнат.
  • UPPER(indexed-column) предотвратява използването на индекс в тази колона. Това лесно се заобикаля, като декларирате, че тази колона има COLLATION което е „нечувствително към малки и главни букви“ -- тоест нещо като utf8_unicode_ci; обърнете внимание на _ci .
  • LIKE '%... не може да използва индекс поради водещия заместващ знак.

Освен това обикновено е глупаво да има

32497 row(s) returned

Какво ще правиш с толкова много редове? Времето за мрежов трансфер ще бъде значително, дори ако самата заявка не е.

За да "решите" LIKE , OR и UPPER проблеми наведнъж, съберете текста заедно в една колона в една таблица. След това предоставете FULLTEXT индекс на тази колона. The, MATCH ... AGAINST ... ще работи много по-бързо -- поне за извършване на SomeName Търсене. (LEFT JOINs са друг въпрос.)




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Има ли конвенция за именуване за MySQL?

  2. MySQL – Възстановяване на пропусната база данни със схема на производителност

  3. PHP цикълът while е разделен на две

  4. изберете count(*) от таблицата на mysql в php

  5. Как да сортирате резултатите от заявката по разстояние в Laravel QueryBuilder / MySQL Spatial пакет?