Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: MySql и индексы
 
 автор: TetRiska   (13.07.2011 в 17:12)   письмо автору
 
 

Вот хочу для себя уточнить некоторые моменты.
1 - если я в запросе связываю две таблицы company и produce по полям company_id, то эти поля в обеих связываемых таблицах должны быть индексами?
2 - если в запросе я использую условие WHERE company_id, то это company_id должно быть также индексом

Рассматриваю таблицу, которую я не делал, и вот возник вопрос по свойствам индекса:
1 - первичный индекс содержит два поля, не могли бы сказать предположительно зачем так, остальные по одному?
2 - можно индексу ставить значение для полнотекстового поиска, что бы это могло значить?
3 - длинна поля для чего служит при добавление в создаваемом индексе

Прошу сильно не ругаться, хотелось бы выслушать конкретные ответы на вопросы. В поиске найти могу, но подача с уст быстрей усваиваемая. Надеюсь на Ваше понимание. Спасибо.

  Ответить  
 
 автор: Саня   (13.07.2011 в 17:30)   письмо автору
 
   для: TetRiska   (13.07.2011 в 17:12)
 

Индексы — большая и сложная тема. Рекомендую для начала почитать какую-нибудь толковую книгу по mysql.
А на ваши вопросы невозможно ответить без знания структуры ваших таблиц и запросов, которые хотите выполнять на них.

  Ответить  
 
 автор: TetRiska   (13.07.2011 в 17:48)   письмо автору
 
   для: Саня   (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

  Ответить  
 
 автор: cheops   (13.07.2011 в 17:54)   письмо автору
 
   для: TetRiska   (13.07.2011 в 17:48)
 

>Вот запрос которому будет достаточно индексов что уже присущи верно?
Да, эти двухстолбцовые индексы должны и для этого запроса работать.

>А для такого запроса потребуется добавление индекса в таблицу em_company
Вообще говоря не обязательно, первичный ключ и здесь сработает, вот если будет отдельное WHERE-условие по em_region_id, которое вы захотите ускорить, потребуется отдельный индекс, первичный ключ тут уже не поможет.

  Ответить  
 
 автор: cheops   (13.07.2011 в 17:42)   письмо автору
 
   для: TetRiska   (13.07.2011 в 17:12)
 

1. Хуже не будет
2. От условия зависит, помимо этого столбца в WHERE-запросе есть еще условия?

1. От таблицы зависит, например в паспорте тоже первичный индекс по двум значениям - серия и номер паспорта. Иногда значения одного столбца не достаточно для индексирования всей таблицы, иногда есть какие-то другие соображения, нужно больше информации о самой таблице.
2. Вы сможете искать по этим полям при помощи конструкции MATCH ... AGAINST().
3. Сколько значений будет индексироваться, если к узлу индекса привязано множество строк, то он может работать малоэффективно (индекс не селективный), слишком селективный индекс (один индекс - одно значение) при некоторых запросах тоже может быть не очень эффективен. Значение (при индексировании строк), позволяет выбрать золотую середину.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования