|
|
|
| Вот хочу для себя уточнить некоторые моменты.
1 - если я в запросе связываю две таблицы company и produce по полям company_id, то эти поля в обеих связываемых таблицах должны быть индексами?
2 - если в запросе я использую условие WHERE company_id, то это company_id должно быть также индексом
Рассматриваю таблицу, которую я не делал, и вот возник вопрос по свойствам индекса:
1 - первичный индекс содержит два поля, не могли бы сказать предположительно зачем так, остальные по одному?
2 - можно индексу ставить значение для полнотекстового поиска, что бы это могло значить?
3 - длинна поля для чего служит при добавление в создаваемом индексе
Прошу сильно не ругаться, хотелось бы выслушать конкретные ответы на вопросы. В поиске найти могу, но подача с уст быстрей усваиваемая. Надеюсь на Ваше понимание. Спасибо. | |
|
|
|
|
|
|
|
для: TetRiska
(13.07.2011 в 17:12)
| | Индексы — большая и сложная тема. Рекомендую для начала почитать какую-нибудь толковую книгу по mysql.
А на ваши вопросы невозможно ответить без знания структуры ваших таблиц и запросов, которые хотите выполнять на них. | |
|
|
|
|
|
|
|
для: Саня
(13.07.2011 в 17:30)
| | Приведу пример дампа 2-х таблиц и сам запрос.
CREATE TABLE `em_company` (
`em_company_id` int(10) unsigned NOT NULL auto_increment,
`em_company_parent` int(10) unsigned NOT NULL default '0',
`em_company_name` varchar(255) NOT NULL default '',
`em_company_title` varchar(150) NOT NULL default '',
`em_company_desc` text NOT NULL,
`em_region_id` int(10) unsigned NOT NULL default '0',
`em_company_address` varchar(255) NOT NULL default '',
`em_company_site` varchar(255) character set cp1251 NOT NULL default '',
`em_company_mail` varchar(255) character set cp1251 NOT NULL default '',
`em_company_phone` varchar(255) NOT NULL default '',
PRIMARY KEY (`em_company_id`,`em_company_parent`)
) ENGINE=MyISAM AUTO_INCREMENT=2337 DEFAULT CHARSET=utf8;
|
CREATE TABLE `em_regions` (
`em_region_id` int(10) unsigned NOT NULL auto_increment,
`em_region_parent` int(10) unsigned NOT NULL default '0',
`em_region_name` varchar(255) character set utf8 NOT NULL default '',
PRIMARY KEY (`em_region_id`,`em_region_parent`)
) ENGINE=MyISAM AUTO_INCREMENT=40 DEFAULT CHARSET=cp1251;
|
Вот запрос которому будет достаточно индексов что уже присущи верно?
SELECT a.`em_company_name`,
b.`em_region_name`
FROM `em_company` a
JOIN `em_regions` b ON (b.`em_region_id` = a.`em_company_id`)
|
А для такого запроса потребуется добавление индекса в таблицу em_company
KEY `em_region_id` (`em_region_id`),
|
SELECT `em_company_name`
FROM `em_company`
WHERE em_region_id = 10
|
| |
|
|
|
|
|
|
|
для: TetRiska
(13.07.2011 в 17:48)
| | >Вот запрос которому будет достаточно индексов что уже присущи верно?
Да, эти двухстолбцовые индексы должны и для этого запроса работать.
>А для такого запроса потребуется добавление индекса в таблицу em_company
Вообще говоря не обязательно, первичный ключ и здесь сработает, вот если будет отдельное WHERE-условие по em_region_id, которое вы захотите ускорить, потребуется отдельный индекс, первичный ключ тут уже не поможет. | |
|
|
|
|
|
|
|
для: TetRiska
(13.07.2011 в 17:12)
| | 1. Хуже не будет
2. От условия зависит, помимо этого столбца в WHERE-запросе есть еще условия?
1. От таблицы зависит, например в паспорте тоже первичный индекс по двум значениям - серия и номер паспорта. Иногда значения одного столбца не достаточно для индексирования всей таблицы, иногда есть какие-то другие соображения, нужно больше информации о самой таблице.
2. Вы сможете искать по этим полям при помощи конструкции MATCH ... AGAINST().
3. Сколько значений будет индексироваться, если к узлу индекса привязано множество строк, то он может работать малоэффективно (индекс не селективный), слишком селективный индекс (один индекс - одно значение) при некоторых запросах тоже может быть не очень эффективен. Значение (при индексировании строк), позволяет выбрать золотую середину. | |
|
|
|