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

Въведение в SQL индексите

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

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

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

Защо да използвате индекси?

Като цяло, заявки (или справки) в таблица чрез SQL SELECT командите са последователни. Последователното търсене изисква започване от горната част на таблицата и четене на всеки ред данни, докато желаните данни бъдат извлечени. Това е изключително неефективно и може да бъде скъпа операция по отношение на скоростта.

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

Анатомията на индекса на уникална база данни

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

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

Примерите по-долу демонстрират как първичните ключове и уникалните индекси се използват в SQL. Всички примери използват таблица с име Student , в примерна база данни с име exampledb . За да добавите примерните данни, използвайте следната команда:

INSERT INTO Student(SSNumber, LastName, FirstName)
  VALUES
(111111111, Smith, John),
(222222222, Jones, Mary),
(333333333, Hansen, Robert);

Вижте данните, съхранявани в Student таблица:

SELECT * FROM Student;

Трябва да видите следния изход:

+-----------+----------+-----------+
| SSNumber  | LastName | FirstName |
+-----------+----------+-----------+
| 111111111 | Smith    | John      |
| 222222222 | Jones    | Mary      |
| 333333333 | Hansen   | Robert    |
+-----------+----------+-----------+
Забележка Освен ако не е посочено друго, всички команди в това ръководство работят добре и на MySQL и PostgreSQL бази данни.

Първичен ключ и индекс с една колона

Като пример, приемете, че училището следи своите ученици в таблица с име Student . Тази таблица има свързани колони с име Student , SSNumber , LastName и FirstName . От тези колони Student е колоната с първичен ключ, тъй като уникално идентифицира всеки ред от данни в Student маса. Създайте уникален индекс (SSIndex ) на SSNumber колона, за да се улесни бързото извличане на данни от таблицата. Следната SQL DDL команда се използва за изпълнение на тази заявка:

СЪЗДАВАНЕ НА ТАБЛИЦА Студент (SSNumber CHAR(9) NOT NULL,Фамилно име VARCHAR(30) NOT NULL,First Name VARCHAR(20) NOT NULL,ПЪРВЕН КЛЮЧ (SSNumber));

CREATE UNIQUE INDEX SSIndex ON Student (SSNumber);
Забележка И двете SQL команди по-горе са разделени с точка и запетая (;), което е съвместимо с повечето системи за релационни бази данни. SSNumber е специално определен като първичен ключ на таблицата.

SSIndex съдържа само информация, която уникално идентифицира данни във всеки ред на Student маса. Всеки ред от SSIndex има указател към съответния ред в Student маса. Този SSIndex index ви позволява да избегнете последователно търсене на данни в таблицата, което подобрява производителността чрез минимизиране на времето, необходимо за заявката.

За да намерите свързаната информация за Robert Hansen чрез техния SSNumber , използвайте SQL командата, включена по-долу. Командата не само елиминира последователното търсене на Student таблица, но също така използва SSIndex за осигуряване на директен достъп до необходимия ред с данни. Това е по силата на използването на хеш-функция и свързан индексен указател.

SELECT * FROM Student WHERE SSNumber = 333333333;

Върнатите данни трябва да са следните:

+-----------+----------+-----------+
| SSNumber  | LastName | FirstName |
+-----------+----------+-----------+
| 333333333 | Hansen   | Robert    |
+-----------+----------+-----------+

Многоколона композитен първичен ключ и индекс

Примерите в този раздел използват три таблици, които съхраняват данни, свързани с тенис лига. Трите маси са наречени Player , League и Membership . Един играч може да играе в няколко лиги и таблицата за членство осигурява тази асоциация. Трите таблици имат следните колони, свързани с тях:

Колоните на Player таблицата се показват по-долу с PlayedID като първичен ключ.

+----------+-----------+-----------+
| PlayedID | LastName  | FirstName |
+----------+-----------+-----------+

Колоните на League таблицата се показват по-долу с LeagueId като първичен ключ.

+----------+------------+------------+
| LeagueId | LeagueName | SkillLevel |
+----------+------------+------------+

Колоните на Membership таблицата се показват по-долу

+----------+-----------+
| PlayedID | LeagueId  |
+----------+-----------+

Стъпките по-долу ви показват как да създадете Player , League и Membership таблици.

  1. От Player таблица, PlayedID колоната уникално идентифицира всеки ред от данни. Създайте Player таблица, последвана от уникален индекс на PlayerId колона.

     CREATE TABLE Player (
       PlayedID INT NOT NULL,
       LastName VARCHAR(30) NOT NULL,
       FirstName VARCHAR(20) NOT NULL,
       PRIMARY KEY (PlayedID)
     );
    
     CREATE UNIQUE INDEX PlayerIndex ON Player (PlayedID);
    
  2. От League таблица, LeagueId колоната уникално идентифицира всеки ред от данни. Създайте League таблица, последвана от уникален индекс на LeagueId колона. Следва SQL командата за извършване на тази операция:

     CREATE TABLE League (
       LeagueId INT NOT NULL,
       LeagueName VARCHAR(50) NOT NULL,
       SkilLevel VARCHAR(20) NOT NULL,
       PRIMARY KEY (LeagueId)
     );
    
     CREATE UNIQUE INDEX LeagueIndex ON League (LeagueId);
    
  3. От Membership таблица, както PlayedID и LeagueId колоните уникално идентифицират всеки ред от данни; който е съставният първичен ключ. Създайте Membership таблица, последвана от уникален съставен индекс на PlayedID и LeagueId колони.

     CREATE TABLE Membership (
       PlayerId INT NOT NULL,
       LeagueId INT NOT NULL,
       PRIMARY KEY(PlayerId, LeagueId)
     );
    
     CREATE UNIQUE INDEX MembershipIndex ON Membership (PlayerId, LeagueId);
    

MembershipIndex е хеш-генериран индекс, състоящ се от съставния ключ (PlayedId и LeagueId ). Той има указатели към редовете с данни, които представлява. Използването на такъв индекс улеснява бързото извличане на данни с директен достъп, за разлика от линейното последователно извличане на данни. Например, за да определите всички играчи, свързани с „Мъже двойки“ от няколко записа във всяка от таблиците по-горе, можете да издадете следната SQL команда:

SELECT Player.LastName, Player.Firstname
FROM Player, Membership
WHERE Membership.LeagueId = 2
AND Membership.PlayerId = Player.PlayerId

Следните данни се връщат:

+----------+-----------+
| LastName | FirstName |
+----------+-----------+
| Smith    | John      |
| Hansen   | Robert    |
+-----------+----------+

Без използването на MembershipIndex и PlayerIndex , заявката по-горе ще се изпълни значително по-бавно.

Неуникални индекси

Неуникален индекс съдържа записи, които могат да сочат към един или повече редове за дадени ключови стойности. Например, за да търсите по име на човек, е необходимо да създадете неуникален съставен индекс в таблица и за FirstName и LastName . Тъй като комбинацията от FirstName и LastName не може да се гарантира, че е уникален, полученият индекс, създаден в тези две колони, ефективно генерира неуникален индекс.

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

Докато индексите подпомагат скоростта на изпълнение на заявката, те трябва да бъдат актуализирани всеки път, когато индексираните колони се променят или когато редовете на таблицата се добавят или изтриват от базата данни. Това може да бъде пагубно за производителността на базата данни. Важно е да имате предвид количеството вмъкване, изтриване и модификация, необходими на вашите индекси по време на използване на транзакционна база данни. Помислете какво е важно за вас в приложението за база данни; скоростта на изпълнение на заявката или скоростта на манипулиране на данни. Отговорът на този въпрос се крие в това как се използва приложението за база данни, колко често то влияе върху дизайна на базата данни и броя на създадените индекси.

Заключение

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


  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 към PostgreSQL на AWS RDS, част 3

  2. конфигурацията на mysql спира при стартиране на сървъра

  3. Как да вмъкна файл в MySQL база данни?

  4. имплементирайте LIKE заявка в PDO

  5. Каква е разликата между =null и IS NULL?