Создать индекс только для определенных строк в MySQL - PullRequest
2 голосов
/ 03 февраля 2011

Итак, у меня есть забавное требование создания индекса для таблицы только для определенного набора строк.

Вот так выглядит моя таблица:

USER:userid, friendid, созданный, blah0, blah1, ..., blahN

Теперь я хотел бы создать индекс для:

(userid, friendid,создан)

, но только в тех строках, где userid = friendid.Причина в том, что этот индекс будет использоваться только для удовлетворения запросов, в которых предложение WHERE содержит «userid = friendid».Будет много строк, где это НЕ так, и я действительно не хочу тратить все это дополнительное пространство на индекс.

Другой вариант - создать таблицу (таблицу запросов), которая будет заполнена.при вставке / обновлении этой таблицы и создании триггера для этого, но, опять-таки, я предполагаю, что индекс этой таблицы будет означать, что данные будут храниться дважды.

Как mysql хранит первичные ключи?Я имею в виду, упорядочена ли таблица по первичному ключу или она упорядочена по порядку вставки, а PK похож на обычный уникальный индекс?

Я проверил кластерные индексы (http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html),, но, похоже, только InnoDB их поддерживаетЯ использую MyISAM (я упоминаю об этом, потому что тогда я мог бы создать кластерный индекс для этих 3 полей в таблице запросов).

Я в основном ищу что-то вроде этого:

ИНДЕКС ДОБАВЛЕНИЯ ПОЛЬЗОВАТЕЛЕЙ ТАБЛИЦЫ (ИД-пользователя, друга, создан) ГДЕ ИД-пользователя = друга *

Ответы [ 2 ]

4 голосов
/ 03 февраля 2011

Относительно условного индекса:

Вы не можете этого сделать.MySQL не имеет такой вещи.

Относительно первичного ключа:

Это зависит от механизма хранения.MySQL не определяет, как данные хранятся или извлекаются, это остается за механизм хранения.

MyISAM не устанавливает порядок хранения строк;они добавляются в конец таблицы, но пропуски при удалении можно использовать повторно, и UPDATE запросы могут оставить вещи не в порядке даже без каких-либо DELETE s.

InnoDB сохраняет строки в порядке их первичногоключи.

0 голосов
/ 03 февраля 2011

трудно сказать, что вы на самом деле пытаетесь сделать здесь (зачем пользователю быть его собственным другом?), Но мне кажется, простое переосмысление вашей схемы базы данных решило бы эту проблему.

таблица 1: ПОЛЬЗОВАТЕЛЬ: ИД пользователя, создан, blah0, blah1, ...,

таблица 2: userIsFriend (user1, user2, ...)

и просто выполните индексацию в таблице 2 (элементы которой предположительно имеют ограничение внешнего ключа для таблицы 1)

Кстати, вам, вероятно, следует использовать InnoDB, если вы все равно хотите сделать что-нибудь полусерьезное с mySQL, ИМХО.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...