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

Разбиране на индексите в MySQL:Част първа

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

Какво са индексите?

По принцип, както вече беше отбелязано в предишна публикация в блога относно индексите, индексът е азбучен списък от записи с препратки към страниците, на които са споменати. В MySQL индексът е структура от данни, която най-често се използва за бързо намиране на редове. Може също да чуете термина „ключове“ – той се отнася и за индекси.

Какво правят индексите?

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

Типове на MySQL индекс

Що се отнася до MySQL, може би сте чували, че има няколко типа индекси:

  • ИНДЕКС на B-дърво – такъв индекс често се използва за ускоряване на заявки SELECT, съответстващи на клауза WHERE. Такъв индекс може да се използва в полета, където стойностите не трябва да са уникални, той също така приема стойности NULL.

  • ПЪЛНОТЕКСТОВ ИНДЕКС – такъв индекс се използва за използване на възможностите за пълнотекстово търсене. Този тип индекс намира ключови думи в текста, вместо директно да сравнява стойностите със стойностите в индекса.

  • Често се използва УНИКАЛЕН ИНДЕКС за премахване на дублиращи се стойности от таблица. Налага уникалността на стойностите на редовете.

  • ПРАВИЛНИЯ КЛЮЧ също е индекс – често се използва заедно с полета с атрибут AUTO_INCREMENT. Този тип индекс не приема стойности NULL и веднъж зададени, стойностите в колоната, която има ПРАВИЛЕН КЛЮЧ, не могат да бъдат променени.

  • НИЗАДЯЩ ИНДЕКС е индекс, който съхранява редове в низходящ ред. Този тип индекс е въведен в MySQL 8.0 - MySQL ще използва този тип индекс, когато заявката изисква низходящ ред.

Избор на оптимални типове данни за индекси в MySQL

Що се отнася до индексите, също така е необходимо да се има предвид, че MySQL поддържа голямо разнообразие от типове данни и някои типове данни не могат да се използват заедно с определени видове индекси (например FULLTEXT индексите могат да се използват само върху текстови колони (CHAR, VARCHAR или TEXT) - те не могат да се използват за други типове данни), така че преди да изберете всъщност индексите за дизайна на вашата база данни, решете типа данни, който ще използвате въпросната колона (решете какъв вид клас данни ще съхранявате:ще съхранявате ли числа? Низови стойности? И числа, и низови стойности? и т.н.), след което решете обхвата на стойностите, които ще съхранявате (изберете този, който не мислите, че ще надхвърлите, защото увеличаването на диапазона от типове данни може да бъде отнемаща време задача по-късно - препоръчваме ви да изберете да използвате прост тип данни) и ако не възнамерявате да използвате NULL стойности във вашите колони, посочете полетата си като NOT NULL винаги, когато можете - когато нулева co lumn е индексиран, изисква допълнителен байт на запис.

Избор на оптимални набори от знаци и съпоставяне за индекси в MySQL

Освен типовете данни, имайте предвид също, че всеки знак в MySQL заема място. Например, UTF-8 знаци може да заемат някъде между 1 и 4 байта всеки, така че може да искате да избегнете индексирането, например 255 знака и да използвате само, да речем, 50 или 100 знака за определена колона.

Предимствата и недостатъците на използването на индекси в MySQL

Основното предимство от използването на индекси в MySQL е повишената производителност на заявките за търсене, съответстващи на клауза WHERE - индексите ускоряват SELECT заявки, съответстващи на клауза WHERE, тъй като MySQL не чете цялата таблица, за да намери редове релевантни на заявката. Имайте предвид обаче, че индексите имат своите недостатъци. Основните са следните:

  • Индексите заемат дисково пространство.

  • Индексите влошават производителността на заявките INSERT, UPDATE и DELETE - когато данните се актуализират, индексът трябва да бъде актуализиран заедно с него.

  • MySQL не ви предпазва от използване на няколко типа индекси едновременно. С други думи, можете да използвате ПЪРВИЧЕН КЛЮЧ, ИНДЕКС и УНИКАЛЕН ИНДЕКС в една и съща колона – MySQL не ви предпазва от такава грешка.

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

Как да изберем най-добрия индекс за използване?

За да изберете най-добрия индекс за използване, можете да използвате вградените механизми на MySQL. Например, можете да използвате обяснението на заявката - заявката EXPLAIN. Той ще обясни каква таблица се използва, дали има дялове или не, какви индекси е възможно да се използват и какъв ключ (индекс) се използва. Той също така ще върне дължината на индекса и количеството редове, които вашата заявка връща:

mysql> EXPLAIN SELECT * FROM demo_table WHERE demo_field = ‘demo’\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: demo_table
   partitions: NULL
         type: ref
possible_keys: demo_field
          key: demo_field
      key_len: 1022
          ref: const
         rows: 1
     filtered: 100.00
        Extra: NULL
1 row in set, 1 warning (0.00 sec)

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

За да изберете най-добрия индекс, който да използвате за вашия конкретен сценарий, имайте предвид, че индексите също могат да бъдат водеща причина за проблеми с производителността. Имайте предвид, че дали MySQL ще използва ефективно индексите или не зависи от няколко фактора, включително дизайна на вашите заявки, използваните индекси, видовете индекси, които се използват, също и натоварването на вашата база данни в момента на изпълнение на заявката и други неща. Ето няколко неща, които трябва да имате предвид, когато използвате индекси в MySQL:

  • С колко данни разполагате? Може би някои от тях са излишни?

  • Какви заявки използвате? Вашите заявки биха ли използвали клаузи LIKE? Какво ще кажете за поръчката?

  • Какъв вид индекс ще трябва да използвате, за да подобрите ефективността на заявките си?

  • Дали вашите индекси ще бъдат големи или малки? Трябва ли да използвате индекс на префикс на колоната, за да намалите размера й?

Заслужава да се отбележи, че вероятно трябва да избягвате използването на множество типове индекси (напр. индекс на B-дърво, УНИКАЛЕН ИНДЕКС и ПЪРВИЧЕН КЛЮЧ) също в една и съща колона.

Подобряване на производителността на заявката с индекси

За да подобрите производителността на заявките с индекси, трябва да разгледате заявките си - изразът EXPLAIN може да помогне за това. Като цяло, ето няколко неща, които трябва да имате предвид, ако искате вашите индекси да подобрят ефективността на вашите заявки:

  • Попитайте от базата данни само това, от което се нуждаете. В повечето случаи използването на колона SELECT ще бъде по-бързо от използването на SELECT * (това е случаят и без използването на индекси)

  • Индексът на B-дърво може да е подходящ, ако търсите точни стойности (напр. SELECT * FROM demo_table WHERE some_field ='x') или ако искате да търсите стойности с помощта на заместващи знаци (напр. SELECT * FROM demo_table WHERE some_field LIKE 'demo%' - в този случай, имайте предвид, че използването на заявки LIKE с каквото и да е в началото може да направи повече вреда, отколкото полза - избягвайте да използвате LIKE заявки със знак за процент пред текста, който търсите - по този начин MySQL може да не използва индекс, защото не знае с какво започва стойността на реда) - въпреки че имайте предвид че индекс на B-дърво може да се използва и за сравнения на колони в изрази, които използват равно (=), повече от (>), повече или равно на (>=), по-малко от (<), по-малко от или равно на (<=) или BETWEEN оператори.

  • ПЪЛНОТЕКСТОВ индекс може да е подходящ, ако се окажете, че използвате пълен текст (СЪВТОРВАНЕ ... СРЕЩУ( )) заявки за търсене или ако вашата база данни е проектирана по такъв начин, че използва само текстови колони - FULLTEXT индексите могат да използват колони TEXT, CHAR или VARCHAR, те не могат да се използват за други типове колони.

  • Покриващ индекс може да е от полза, ако искате да изпълнявате заявки без допълнителни I/O четения на големи таблици . За да създадете покриващ индекс, покрийте клаузите WHERE, GROUP BY и SELECT, използвани от заявката.

По-нататък ще разгледаме типовете индекси в предстоящите части от тази серия от блогове, но като цяло, ако използвате заявки като SELECT * FROM demo_table WHERE some_field ='x' ИНДЕКС на B-дърво може да е подходящо, ако използвате заявки MATCH() AGAINST() вероятно трябва да погледнете в индекс FULLTEXT, ако вашата таблица има много дълги стойности на редове, вероятно трябва да разгледате индексирането на част от колоната.

Колко индекса трябва да имате?

Ако някога сте използвали индекси, за да подобрите производителността на вашите SELECT заявки, вероятно сте си задавали въпрос:колко индекса всъщност трябва да имате? За да разберете това, трябва да имате предвид следните неща:

  1. Индексите обикновено са най-ефективни при големи количества данни.

  2. MySQL използва само един индекс за всеки оператор SELECT в заявка (подзаявките се разглеждат като отделни оператори) - използвайте заявката EXPLAIN, за да разберете кои индекси са най-ефективни за заявките, които използвате.

  3. Индексите трябва да правят всичките ви изрази SELECT достатъчно бързи, без да компрометират твърде много дисково пространство - „достатъчно бързо“ , обаче е относително, така че ще трябва да експериментирате.

Индекси и машини за съхранение

Когато работите с индекси в MySQL, имайте предвид също, че може да има някои видове ограничения, ако използвате различни машини (например ако използвате MyISAM вместо InnoDB). Ще разгледаме по-подробно в отделен блог, но ето някои идеи:

  • Максималният брой индекси за MyISAM и InnoDB таблици е 64, максималният брой колони на индекс и в двете двигатели за съхранение е 16.

  • Максималната дължина на ключа за InnoDB е 3500 байта - максималната дължина на ключа за MyISAM е 1000 байта.

  • Пълнотекстовите индекси имат ограничения в определени машини за съхранение - например индексите на пълен текст InnoDB имат 36 спиращи думи, MyISAM списъкът със спиращи думи е малко по-голям със 143 стоп думи. InnoDB извлича тези думи за спиране от променливата innodb_ft_server_stopword_table, докато MyISAM извлича тези думи за спиране от файла storage/myisam/ft_static.c - всички думи, които се намират във файла, ще бъдат третирани като стоп думи.

  • MyISAM беше единствената машина за съхранение с поддръжка за опции за пълнотекстово търсене до MySQL 5.6 (MySQL 5.6. 4, за да бъдем точни) се появи, което означава, че InnoDB поддържа пълнотекстови индекси от MySQL 5.6.4. Когато се използва индекс FULLTEXT, той намира ключови думи в текста, вместо да сравнява стойностите директно със стойностите в индекса.

  • Индексите играят много важна роля за InnoDB - InnoDB заключва редове, когато осъществява достъп до тях, така че намален брой редове, достъпът до InnoDB може да намали заключванията.

  • MySQL ви позволява да използвате дублиращи се индекси в една и съща колона.

  • Някои машини за съхранение имат определени типове индекси по подразбиране (напр. за механизма за съхранение на ПАМЕТ типът индекс по подразбиране е хеш )

Резюме

В тази част за индексите в MySQL преминахме през някои общи неща, свързани с индексите в тази система за управление на релационна база данни. В предстоящите публикации в блога ще преминем през някои по-задълбочени сценарии за използване на индекси в MySQL, включително използването на индекси в определени машини за съхранение и т.н. - също така ще обясним как ClusterControl може да се използва за постигане на вашите цели за ефективност в 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 с помощта на ClusterControl

  2. 8 начина за добавяне на микросекунди към стойност за дата и час в MariaDB

  3. Какво заслужават нашите клиенти:Представяне на MariaDB Enterprise Documentation

  4. Как работи UPPER() в MariaDB

  5. Как TO_DAYS() работи в MariaDB