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

MySQL индекси – какви са най-добрите практики?

Определено трябва да отделите известно време в четене на индексирането, има много писано за това и е важно да разберете какво се случва.

Най-общо казано, индексът налага подреждане на редовете на таблица.

За простота, представете си, че таблицата е просто голям CSV файл. Всеки път, когато се вмъкне ред, той се вмъква в края . Така че "естественото" подреждане на таблицата е просто редът, в който са били вмъкнати редовете.

Представете си, че имате този CSV файл, зареден в много елементарно приложение за електронни таблици. Всичко, което прави тази електронна таблица, е да показва данните и номерира редовете в последователен ред.

Сега си представете, че трябва да намерите всички редове, които имат някаква стойност "M" в третата колона. Предвид това, с което разполагате, имате само една опция. Сканирате таблицата, като проверявате стойността на третата колона за всеки ред. Ако имате много редове, този метод („сканиране на таблица“) може да отнеме много време!

Сега си представете, че в допълнение към тази таблица имате и индекс. Този конкретен индекс е индексът на стойностите в третата колона. Индексът изброява всички стойности от третата колона, в някакъв смислен ред (да речем, по азбучен ред) и за всяка от тях предоставя списък с номера на редовете, където се появява тази стойност.

Сега имате добра стратегия за намиране на всички редове, където стойността на третата колона е "M". Например, можете да извършите двоично търсене ! Докато сканирането на таблицата изисква от вас да разгледате N реда (където N е броят на редовете), двоичното търсене изисква само да разгледате log-n записи в индекса, в най-лошия случай. Уау, това със сигурност е много по-лесно!

Разбира се, ако имате този индекс и добавяте редове към таблицата (в края, тъй като така работи нашата концептуална таблица), трябва да актуализирате индекса всеки път. Така че вършите малко повече работа, докато пишете нови редове, но спестявате много време, когато търсите нещо.

Така че като цяло индексирането създава компромис между ефективността на четене и ефективността на запис. Без индекси, вмъкванията могат да бъдат много бързи - машината на базата данни просто добавя ред към таблицата. Докато добавяте индекси, машината трябва да актуализира всеки индекс, докато извършва вмъкването.

От друга страна, четенето става много по-бързо.

Надяваме се, че това обхваща първите ви два въпроса (както са отговорили други - трябва да намерите правилния баланс).

Третият ви сценарий е малко по-сложен. Ако използвате LIKE, индексиращите машини обикновено ще ви помогнат за скоростта на четене до първия "%". С други думи, ако ИЗБИРАТЕ колона WHERE КАТО 'foo%bar%', базата данни ще използва индекса, за да намери всички редове, където колоната започва с "foo", и след това трябва да сканира този междинен набор от редове, за да намери подмножеството който съдържа "бар". SELECT ... WHERE колона LIKE '%bar%' не може да използва индекса. Надявам се, че можете да разберете защо.

И накрая, трябва да започнете да мислите за индекси в повече от една колона. Концепцията е същата и се държи подобно на нещата LIKE - по същество, ако имате индекс върху (a,b,c), двигателят ще продължи да използва индекса отляво надясно, доколкото може. Така че търсенето в колона a може да използва индекса (a,b,c), както и при (a,b). Въпреки това, двигателят ще трябва да направи пълно сканиране на таблицата, ако търсите WHERE b=5 И c=1)

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да синхронизирам база данни SQLite на телефон с Android с база данни MySQL на сървъра?

  2. Как работи функцията RTRIM() в MySQL

  3. Spring Boot CRUD Пример с MySQL

  4. Оптимизирайте производителността на MySQL/MariaDB с инструмента MySQLTunner

  5. как да получите идентификатор за последно вмъкване след заявка за вмъкване в активен запис на codeigniter