Покриващият индекс не е същото като съставния индекс.
Ако имам 2 отделни индекса, единият на col3, а другият на col4, кой от тях ще бъде използван в тази заявка?
Индексът с най-висока мощност.
MySQL съхранява статистика за това кой индекс какви свойства има.
Ще бъде използван индексът, който има най-силна дискриминираща сила (както е видно от статистиката на MySQL).
Четох някъде, че за всяка таблица в заявката се използва само един индекс. Това означава ли, че няма начин заявката да използва и двата индекса?
Можете да използвате подселекция.
Или още по-добре използвайте съставен индекс, който включва както col3, така и col4.
Второ, ако създам съставен индекс, използвайки и col3 и col4 заедно, но използвах само col3 в клаузата WHERE ще бъде ли по-лошо за производителността? пример:
Сложен индекс
Правилният термин е compound
индекс, а не съставен.
Само най-лявата част от съставния индекс ще се използва.
Така че, ако индексът е дефиниран като
index myindex (col3, col4) <<-- will work with your example.
index myindex (col4, col3) <<-- will not work.
Вижте:http://dev.mysql.com /doc/refman/5.0/en/multiple-column-indexes.html
Имайте предвид, че ако изберете най-ляво поле, можете да се измъкнете от това да не използвате тази част от индекса във вашата клауза where.
Представете си, че имаме съставен индекс
Myindex(col1,col2)
SELECT col1 FROM table1 WHERE col2 = 200 <<-- will use index, but not efficiently
SELECT * FROM table1 where col2 = 200 <<-- will NOT use index.
Причината това да работи е, че първата заявка използва покриващия индекс и прави сканиране върху него.
Втората заявка трябва да има достъп до таблицата и поради тази причина сканирането, въпреки че индексът няма смисъл.
Това работи само в InnoDB.
Какво е покриващ индекс
Покриващ индекс се отнася до случая, когато всички полета, избрани в заявка, са covered
чрез индекс, в този случай InnoDB (не MyISAM) никога няма да прочете данните в таблицата, а ще използва само данните в индекса, значително ускорявайки избора.
Обърнете внимание, че в InnoDB първичният ключ е включен в всички вторични индекси, така че по някакъв начин всички вторични индекси са съставни индекси.
Това означава, че ако изпълните следната заявка в InnoDB:
SELECT indexed_field FROM table1 WHERE pk = something
MySQL винаги ще използва покриващ индекс и няма да има достъп до действителната таблица. Въпреки че може да използва покриващ индекс, той ще предпочете PRIMARY KEY
защото трябва да удари само един ред.