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

MySQL съставни индекси и оператор BETWEEN

Стилът ви е много необичаен.

Повечето хора вероятно биха написали WHERE began_at < NOW() AND finished_at > NOW()

Въпреки това. Бих препоръчал да поставите индекс и на двете полета.

Комбиниран ключ няма да ви е от полза, защото ще ускори само търсенето на конкретни комбинации от дати.

Е, това не е напълно вярно, защото ако използвате betree, комбиниран ключ ще ви помогне, но не толкова добре, колкото ако ги индексирате отделно. Комбинираните ключове са много добри, ако търсите комбинации от полета с оператор за равенство (=). Индексите на единично поле се представят по-добре при заявки за ragen.

Можете да потърсите в Google малко за "търсене в многоизмерен диапазон".

Причината е, че всички съвпадащи полета в едно поле могат да бъдат намерени основно в log(n) време в btrees. Така че цялостното ви време на изпълнение ще бъде O(k*log(n)), което е O(log(n)).

Заявките за многоизмерен диапазон имат време на изпълнение от O(sqrt(n)), което е по-високо. Има обаче и по-добри реализации, които също постигат логаритмично време на изпълнение. Те обаче не са напълно внедрени в mysql, така че ще бъде по-лошо или ужасно в зависимост от версията.

Така че нека обобщя:

  • Сравнения на равенство в единични полета:хеш индекс (време на изпълнение O(1))

  • Търсене в диапазон на единични полета:btree индекс на единични полета ( O(log(n)) )

  • Търсене на равенство в множество полета:комбиниран хеш ключ (време на изпълнение O(1))

тези случаи са ясно нещо...

  • Търсене в диапазона в множество полета:отделни индекси на btree ( O(log(n)) )

тук не е толкова ясно. с настоящите версии е очевидно по-добре да се индексира отделно поради причините, посочени по-горе. С перфектно изпълнение за този случай на употреба бихте могли да постигнете по-добра производителност с комбинирани ключове, но няма известна система, която го поддържа. имате нужда от това) от версия 5.0, но само много ограничени и оптимизаторът на заявки ги използва само в редки случаи afaik. не знам за по-нови версии като 5.3 или нещо подобно.

обаче с прилагането на mysql на свободни индекси, комбинираните ключове в полета, където извършвате заявки за диапазон или сортиране в различни посоки, стават все по-подходящи.



  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. Трябва ли да използвам PreparedStatements за всички мои вмъквания в база данни в Java?

  3. Доверен ли е LAST_INSERT_ID() в транзакция?

  4. Еквивалент на SQL Server 2000 за ДВУЛИРАНЕ НА КЛЮЧ?

  5. Mysql:latin1-> utf8. Преобразувайте знаците в техните многобайтови еквиваленти