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

Правилно индексиране при използване на оператор ИЛИ

Погрешно разбирате как работят индексите.

Помислете за телефонен указател (еквивалент на индекс с две колони на първо име, име и фамилия). Ако ви помоля да намерите всички хора в телефонния указател, чието фамилно име е „Смит“, можете да се възползвате от факта, че имената са подредени по този начин; можете да предположите, че Смитовете са организирани заедно. Но ако ви помоля да намерите всички хора, чието име е "Джон", нямате полза от индекса. Джонс може да има произволно фамилно име и така те са разпръснати из цялата книга и в крайна сметка се налага да търсите по трудния начин, от кора до кора.

Сега, ако ви помоля да намерите всички хора, чието фамилно име е „Смит“ ИЛИ чието име е „Джон“, можете да намерите Смитс лесно както преди, но това изобщо не ви помага да намерите Джон. Те все още са разпръснати из цялата книга и трябва да ги потърсите по трудния начин.

Същото е и с индексите с няколко колони в SQL. Индексът се сортира по първата колона, след това се сортира по втората колона в случаите на връзки в първата колона, след това се сортира по третата колона в случаите на връзки в първите две колони и т.н. Не се сортира по всички колони едновременно. Така че вашият индекс с няколко колони не помага да направите думите ви за търсене по-ефективни, с изключение на най-лявата колона в индекса.

Върнете се към първоначалния си въпрос.

Създайте отделен индекс с една колона за всяка колона. Един от тези индекси ще бъде по-добър избор от другите, въз основа на оценка на колко I/O операции индексът ще възникне, ако се използва.

Съвременните версии на MySQL също имат някои интелигентности относно сливането на индекси , така че заявката може използвайте повече от един индекс в дадена таблица и след това опитайте да обедините резултатите. В противен случай MySQL обикновено е ограничен да използва един индекс на таблица в дадена заявка.

Друг трик, който много хора използват успешно, е да направите отделна заявка за всяка от вашите индексирани колони (която трябва да използва съответния индекс) и след това UNION резултатите.

SELECT fields FROM table WHERE field1='something' 
UNION
SELECT fields FROM table WHERE field2='something' 
UNION
SELECT fields FROM table WHERE field3='something' 
UNION
SELECT fields FROM table WHERE field4='something' 

Едно последно наблюдение:ако откриете, че търсите същото 'something' в четири полета, трябва да преразгледате дали всичките четири полета всъщност са едно и също нещо и вие сте виновни за проектиране на таблица, която нарушава първата нормална форма с повтарящи се групи . Ако е така, може би поле1 до поле4 принадлежат към една колона в дъщерна таблица. Тогава става много по-лесно за индексиране и запитване:

SELECT fields from table INNER JOIN child_table ON table.pk = child_table.fk
WHERE child_table.field = 'something'


  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. изберете 1 произволен ред със сложно филтриране

  3. Може ли външен ключ да препраща към неуникален индекс?

  4. Внедряване и проектиране на архитектура за система за уведомяване с помощта на socket.io node.js и входящи съобщения

  5. PHP SQL STMT ИЗБЕРЕТЕ няколко LIKE? възможно ли е?