![]() |
Чем KEY отдличается от INDEX?
|
если ты имеешь в виду PRIMARY KEY и INDEX в MySQL, то в общем, ничем. (кроме того, что PRIMARY KEY единственный и неповторимый :)) И вообще скорее это исторически сложившиеся названия. Но бывают еще, например, такие звери, как REFERENCE KEY (по-моему, в новых версиях MySQL - тоже) Там идет отслеживание целостности данных.
|
Вообще вроде в теории INDEX-это поле, которое просто указывает на определённые запись данных, то есть по идеи INDEX может повторятся в одной и той же таблице, если он указывает на одинаковые записи данных
PRIMARY KEY - это вроде индекс, но его значения не повторяются, то есть как написала mar-он единственный и неповторимый Добавлено: поэтому поле с auto_increment будет всегда PRIMARY, так как его значения не могут повторятся |
mar
в MySQL есть еще и просто KEY. Хранится он в таблице индексов. для оптимизации работы есть ANALYZE TABLE причем в документации сказано что она оптимизирует KEY причем это правда, я наблюдал прирост в 100раз (!), но там ничего не сказано об оптимизации INDEX. чтоты разрешить что лучьше использовать для ускорения поиска и в чем их разничия я напишу пару тестов, а потом приведу здесь их результаты. |
6) KEY vs INDEX и нужно ли применять ANALYZE TABLE.
Многие слышали про KEY и про INDEX, но когда им задают вопрос «а чем они отличаются?» они затрудняются ответить. Для того чтобы найти ответ на этот вопрос я решил произвести несколько тестов. Первый тест был на создание таблицы, я создавал таблицу с ключами по нескольким столбцам, потом создавал такую же таблицу, но в место KEY использовал INDEX, результат – размер таблиц идентичен. Скорость выборки была тоже идентична. Примечание: после каждого добавления большого куска данных применялся ANALYZE TABLE. Теперь я создаю те же самые таблицы, но без вызова ANALYZE TABLE. Для таблицы с индексами размер идентичен, что и с вызовом ANALYZE TABLE, аналогично и для KEY. Теперь перейдем к тестам на скорость выборки, и тут нас ожидает сюрприз – скорость выборки упала в 3.3 раза. Выводы: INDEX и KEY хранятся одинаково, для ускорения выборки обязательно нужно применять ANALYZE TABLE, влияние на скорость выборки у них идентичное, основное различие в синтаксисе их применения! |
Влад, существует MySQL, версии которого несколько отличаются друг от друга и все - от стандарта SQL
Поэтому, наверное, можно эксперементировать, а можно посмотреть, что предлагает реляционная модель данных и что из этого имеется в MySQL индекс (index) в реляционных базах данных вообще - *своего рода предметный указатель по атрибутам (полям), дающие ссылки на строки (записи), в которых встречается то, или иное значение. Таким образом, индекс обеспечивает увеличение скорости доступа - выборок. Лучше поцитируем что-нибудь умное :) (Справочное руководство по языку SQL ( Версия 6.0 Part Number 778-V6.0 * * * * Ноябрь 1988 (Пересмотрено - Февраль 1990): Цитата:
Цитата:
Еще один момент - и не только в MySQL: СУБД "выбирают", использовать ли индекс, или обойтись без него. Хорошо, если правильно :( Теперь ключ (Key) - в релизах MySQl имеет несколько невыраженный характер (в отличие от тестовых новых версий), о чем, помнится, писалось в руководстве по MySQL. (поэтому primary key там отличается от index только свойством primary и, *требованием к уникальности данных) В общем же случае в реляционных базах данных ключи работают для сохранения целостности данных (я упоминала о внешнем ключе - в MySQL он появился, насколько я понимаю только в последних версиях и не для всех типов таблиц, а в стандарте SQL это понятие имеется) Существуют по крайней мере 3 типа ключей (может что еще кто знает - поправте): - candidate (по-моему, в MySQL нет, или есть, но в последних версиях) Уникальные поля (одно, или комбинация из нескольких), однозначно идентифицирующие запись. - primary (имеется в MySQL) отличается от candidate единственностью. - foreign (только в последних версиях MySQL) - набор атрибутов (полей), *присутствующих в нескольких таблицах и являющимся первичным ключеи для одной из них. Обеспечивают связь данных нескольких таблиц и целостность данных (не висят мертвые души в одних таблицах при удалении данных из других таблиц. Ну, и по поводу оптимизации: ANALYZE TABLE, OPTIMIZE TABLE применять, несомненно стоит, хотя бы потому, что при изменении таблиц (удалении, добавлении записей) надо оптимизировать (дефрагментировать) файловое *пространство и перестроить индексы и ключи. (в старые добрые времена при сбоях в машине, аварийном выключении питания и т.д. надо было переиндексировать таблицы - тогда они назывались базами данных, - замечательной тогда СУБД FoxPRO, а то индексы ломались в хлам) При этом - NB - MySQL - не единственная СУБД, в Oracle, Postgresql данные хранятся просто совсем не так (хотя мы и видим все те же таблицы) Уфф Все надоело писать, пусть желающие правят-дописывают :) |
mar, спасибо Вам большое. да Вы ещё и прекрасная наша половина, оказывается!
всю жизнь в ИТ, и только сегодня регнулся на старом добром осзоне, и то, только ради того, чтобы лично Вас отблагодарить, весь инет набит рассуждениями, включая разные киберфорумы (от которых уже неприятно сидеть в нете, хотя наткнулся тут на топ который был более-менее активен и интересен), так вот, по теме только Ваш пост помог. Мир Вам и много послушных детей :) |
Время: 01:26. |
Время: 01:26.
© OSzone.net 2001-