Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Индексы в таблицах

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
Okula
Отправлено: 02 Октября, 2012 - 13:24:23
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




Задался я таким вопросом: чем отличаются индексы созданные на каждое поле отдельно от индексов объединяющие 2 поля. Например:
CODE (SQL):
скопировать код в буфер обмена
  1. ALTER TABLE `table` ADD INDEX `index_name1` ( `pole1` );
  2. ALTER TABLE `table` ADD INDEX `index_name2` ( `pole2` );

и
CODE (SQL):
скопировать код в буфер обмена
  1. ALTER TABLE `table` ADD INDEX `index_name` ( `pole1`, `pole2` );

В полнотекстовом поиске я ещё понимаю как они работают, а при обычных запросах в чём разница?

(Отредактировано автором: 02 Октября, 2012 - 13:24:58)

 
 Top
Мелкий Супермодератор
Отправлено: 02 Октября, 2012 - 13:46:47
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. ALTER TABLE `table` ADD INDEX `index_name1` ( `pole1` );
  2. ALTER TABLE `table` ADD INDEX `index_name2` ( `pole2` );
  3.  
  4. SELECT * FROM `table` WHERE `pole1`=43 AND `pole2`=65

Сможет использовать только 1 индекс, который, в зависимости от данных, урежет выборку. Но все остальные условия where придётся разбирать уже самому mysql, для этого вычитывая даже ненужные строки.

Во, откопал собственное объяснение: http://forum.php.su/topic.php?fo...04841#1339504841


-----
PostgreSQL DBA
 
 Top
EuGen Администратор
Отправлено: 02 Октября, 2012 - 13:47:53
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Ответ, очевидно, находится в мануале
upd. Кроме предыдущего комментария, существуют еще тонкости (см. ссылку выше)


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Okula
Отправлено: 02 Октября, 2012 - 14:35:35
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




EuGen, спасибо, всё понял. А если довавить как первый так и второй вариант из первого поста индексы будут использоваться в любом случае при таких запросах:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM `table` WHERE `pole1`=4 AND `pole2`=5;
  2. SELECT * FROM `table` WHERE `pole2`=5;
 
 Top
EuGen Администратор
Отправлено: 02 Октября, 2012 - 14:46:41
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Okula пишет:
А если довавить как первый так и второй вариант из первого поста

Имеется ввиду - создать индекс по колонке A, создать индекс по колонке B и создать индекс по колонкам A,B ? Если да, то в случае использования в WHERE условия по A и B - будет использоваться двойной индекс, если в WHERE условие только по A - зависимо (теоретически, может быть ситуация, когда в зависимости от запроса будет использоваться двойной индекс), но в чистов виде будет использован индекс по A; ну и, наконец, если условие WHERE будет только по B - то, разумеется, возможно использовать только индекс по B.

Важное замечание - условие должно быть точным левым подмножеством многоколоночного индекса, чтобы MySQL смогла его использовать. То есть, к примеру, имея индекс по A,B,C и условие WHERE A=5 && C=4 - MySQL не будет использовать индекс, тогда как при условии WHERE A=5 && B=4 - MySQL сможет использовать такой индекс.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Мелкий Супермодератор
Отправлено: 02 Октября, 2012 - 16:32:42
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




EuGen пишет:
имея индекс по A,B,C и условие WHERE A=5 && C=4 - MySQL не будет использовать индекс

не будет использовать индекс для поиска C. А левая часть для поиска по A будет задействована (если оптимизатор не найдёт индекс A&C или вовсе не выберет FullScan, если индекс по A недостаточно уникален)


-----
PostgreSQL DBA
 
 Top
Okula
Отправлено: 02 Октября, 2012 - 16:37:34
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




Всем спасибо, помогли прояснить ситуацию Улыбка
 
 Top
EuGen Администратор
Отправлено: 02 Октября, 2012 - 16:38:36
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Мелкий пишет:
не будет использовать индекс для поиска C. А левая часть для поиска по A будет задействована

Ровно то же самое, что тройной индекс не будет использован (в полном смысле). Более того, с очень большой долей вероятности случится
Мелкий пишет:
выберет FullScan

- как раз по причине недостаточной cardinality


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
vanicon
Отправлено: 03 Октября, 2012 - 01:34:19
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 808
Дата рег-ции: Янв. 2010  
Откуда: Самара


Помог: 17 раз(а)




Читал посты выше и тоже заинтересовало...
Вот у меня есть табличка c полями A и B.
И я делаю вот такие запросы:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM `test` WHERE A = '2';
  2. SELECT * FROM `test` WHERE B = '2';
  3. SELECT * FROM `test` WHERE A = '1' AND B = '2';

Как тут составить индексы?
Делать индекс на каждое поле (индексы A и B), или еще необходим индекс сразу на 2 поля A и B?

(Отредактировано автором: 03 Октября, 2012 - 01:39:28)



-----
Так было, так есть и так будет
 
 Top
Okula
Отправлено: 03 Октября, 2012 - 06:58:56
Post Id



Участник


Покинул форум
Сообщений всего: 1389
Дата рег-ции: Окт. 2010  


Помог: 42 раз(а)




vanicon индекс на 2-а поля (`a`, `b`) будет работать только с такими запросами:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT * FROM `test` WHERE `a` = '2';
  2. SELECT * FROM `test` WHERE `a` = '1' AND `b` = '2';

Если делать индекс на каждое поле отдельно то будет работать со всеми запросами.
 
 Top
vanicon
Отправлено: 03 Октября, 2012 - 18:45:29
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 808
Дата рег-ции: Янв. 2010  
Откуда: Самара


Помог: 17 раз(а)




Okula Спасибо за разъяснение


-----
Так было, так есть и так будет
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB