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

Производителност на MySQL:MySQL/MariaDB индекси

Данните в MySQL/MariaDB база данни се съхраняват в таблици. Един прост начин на мислене за индексите е да си представите обширна електронна таблица. Този тип система не винаги е благоприятна за бързо търсене; това е мястото, където индексът става от съществено значение. Ако няма индекс, тогава машината на базата данни трябва да започне от първи ред и да прегледа всички редове, търсейки съответните стойности. Ако това е малка таблица, тогава не е голяма работа, но в по-големи таблици и приложения, където може да има таблици с милиони и дори милиарди редове, става проблематично. Както можете да си представите, търсенето в тези редове един по един ще отнеме време, дори на най-новия хардуер. Решението е да създадете ИНДЕКС (или повече от един) за вашите данни.

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

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

Кога MySQL използва индекси?

Всеки път, когато сървърът на базата данни трябва да търси информация, той ще използва индекс, за да ускори процеса. Примерите за това включват клаузи WHERE, JOIN ON, MIN/MAX и ORDER BY/GROUP BY. Ако вашите заявки ще търсят или съпоставят колона често в някоя от тези ситуации, трябва да помислите за създаване на индекс.

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

През повечето време краткият отговор е да. За четене и търсене в данните, индексите абсолютно повишават производителността. Неизвършването на пълно сканиране на таблицата ще подобри почти всяка заявка SELECT. Това идва на малка цена. За колони, които често се манипулират, има цена за всяка промяна. Това може да блокира INSERT и UPDATE в базата данни.

Общи типове индекси на MySQL

Има три често срещани типа MySQL индекси:

  • Първичен ключ
  • Индекс
  • Уникален

ПЪРВИЧЕН КЛЮЧ

Първичният ключ казва на сървъра на базата данни коя е най-важната колона(и) в таблицата. Обикновено това се използва за колони с идентификатор на auto_increment. Например, ако имате таблица, която съдържа информация за служителите, бихте искали първичен ключ в колоната „EMPLOYEE_ID“. В други таблици, т.е. таблица със заплати, вие просто бихте се позовали на EMPLOYEE_ID вместо всички данни на служителя.

ИНДЕКС

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

УНИКАЛНО

УНИКАЛНИЯТ индекс е малко различен по това, че поставя специфични ограничения върху това, което може да бъде записано в таблицата. Ако се опитате да вмъкнете ред, който съдържа стойност, която вече е включена в данните, тогава INSERT ще произведе грешка. Това позволява бързо търсене, както и известна цялост на данните.

Как да създадем индекс

Има няколко начина за създаване на индекс в колона. Можете да настроите индекс, когато CREATE TABLE или след това с операторите ALTER TABLE или CREATE INDEX.

Създаване на индекс на PRIMARY KEY

Най-лесният начин да създадете индекс на PRIMARY KEY е да го направите, когато създавате таблицата. Ще използваме пример за таблица на служителите за този урок. Таблицата ще има три колони:ID, FIRSTNAME и FIRSTNAME. Създаването може да изглежда по следния начин:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32)
);

Този израз ще създаде таблицата без индекс. Можем да добавим първичния ключ с изявление като това:

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT PRIMARY KEY (ID);

Това казва на MySQL, че имаме първичен ключ на идентификатора на колоната.

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

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID)
);

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

Създаване на индекс с помощта на CREATE INDEX

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

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID)
);

Можем да добавим индекс към колоната LASTNAME по следния начин:

CREATE INDEX idx1 ON EMPLOYEE (LASTNAME);

Търсенията по LASTNAME вече ще бъдат по-бързи в тази таблица. В този пример „idx1“ е името на индекса. Това ще улесни справянето със самия индекс в бъдеще, ако трябва.

Друг начин за добавяне на индекс към таблица е с командата ALTER TABLE. За да постигнем същото, което направихме с предишния израз, ще изпълним следната команда:

ALTER TABLE EMPLOYEE ADD INDEX idx1 (LASTNAME);

Последният начин да добавите индекс, който ще спести известно време, е да го направите по време на CREATE TABLE. Ако знаете предварително, че ще търсите или ще се присъедините към конкретна колона, тогава можете да създадете първоначалната таблица с индекса, който вече е там:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID),
  INDEX idx1 (LASTNAME)
);

И трите тези твърдения създават един и същ резултат.

Индекси с множество колони

Индексът не трябва да бъде само в една колона. Ако искаме по-бързо търсене както на FIRSTNAME, така и на FIRSTNAME, можем да създадем индекс и за двете колони. В таблицата create ще изглежда така:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  PRIMARY KEY (ID),
  INDEX idx2 (LASTNAME,FIRSTNAME)
);

Използване на командата CREATE INDEX:

CREATE INDEX idx2 ON EMPLOYEE (LASTNAME, FIRSTNAME);

И накрая, командата ALTER TABLE:

ALTER TABLE EMPLOYEE ADD INDEX idx2 (LASTNAME, FIRSTNAME);

Създаване на УНИКАЛЕН ИНДЕКС

Може да има моменти, когато искате да създадете индекс на колона и също така да принудите всички записи в тази колона да бъдат уникални. Ако разширим нашата примерна таблица, за да включим колона OFFICE (указваща кой офис в сградата имат), тогава може да искаме да направим това УНИКАЛЕН индекс. Нека работим с тази таблица:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR(32),
  LASTNAME CHAR(32),
  OFFICE INT,
  PRIMARY KEY (ID)
);

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

За да създадем индекс за това, ще издадем следната команда:

CREATE UNIQUE INDEX idx3 ON EMPLOYEE (OFFICE);

Можете да използвате подобни команди, за да ги създадете в командите CREATE TABLE и ALTER TABLE. Сега, ако се опитате да стартирате тези две вмъквания:

INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (1, 'JANE', 'JOHNSON', 1);

INSERT INTO EMPLOYEE (ID, FIRSTNAME, LASTNAME, OFFICE) VALUES (2, 'JOHN', 'SMITH', 1);

Ще получите грешка при втория INSERT:

Duplicate entry '1' for key 'idx3'

Премахване на индекс

Може да дойде момент, когато вече не искате индекс в колона. Може би сте разбрали, че не търсите колона толкова често и индексът забавя вмъкванията и актуализациите. За да направим това, ще използваме командата DROP INDEX. Нашата таблица е създадена така:

CREATE TABLE EMPLOYEE
(
  ID INT,
  FIRSTNAME CHAR,
  LASTNAME CHAR,
  PRIMARY KEY (ID),
  INDEX idx (LASTNAME,FIRSTNAME)
);

Ако искаме да премахнем индекса на колоните LASTNAME и FIRSTNAME, ще издадем тази команда:

DROP INDEX IDX ON EMPLOYEE;

Заключение

Индексите на бази данни са основен инструмент, който оптимизира скоростта на извличане на данни в структура, която се възползва от ефективността на търсене и четене в таблица. Подобряването на индекса се дължи главно на цената на повече записи и/или място за съхранение, за да се поддържа оптимална структура на индексните данни.

Базите данни MySQL и MariaDB предлагат множество други опции за търсене и четене, включително много, които не бяха обхванати тук. Основните изводи тук включват: 

  • Уверете се, че отделяте време, за да планирате масите си предварително.
  • Ако не планирате предварително, когато създавате таблиците, оценете колоните, които се търсят най-много, и създайте индекс за тях.

Вижте го в действие!

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

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

Навигация по серии<<Предишна статияСледваща статия>>

  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. Как да накарам UTF-8 да работи в уеб приложения на Java?

  4. Групирайте mysql заявката на интервали от 15 минути

  5. MySQL Master To Master репликация