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
Форумы портала PHP.SU :: Версия для печати :: вопрос по индексам в mysql
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » вопрос по индексам в mysql

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

1. exlant - 15 Февраля, 2016 - 15:41:00 - перейти к сообщению
Я создаю таблицу и хочу сразу прописать в ней индексы, правильно ли я делаю?

CODE (SQL):
скопировать код в буфер обмена
  1. CREATE TABLE IF NOT EXISTS some_table(
  2.     id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
  3.     name VARCHAR(255) NOT NULL UNIQUE,
  4.     source_id SMALLINT UNSIGNED NOT NULL UNIQUE,
  5.     INDEX source_index(source_id),
  6.     INDEX id_index(id)
  7.    
  8. )ENGINE=InnoDB DEFAULT CHARSET=utf8;


1. нужно ли задавать INDEXу UNIQUE, если используется столбец с атрибутом UNIQUE, или же mysql автоматом поставит INDEXу атрибут UNIQUE?
2. есть ли смысл делать INDEX для PRIMARY KEY?
3. как посмотреть INDEXы созданные для определенной таблицы, или хотя бы, как посмотреть все имеющиеся индексы?
4. вот я создал таблицу с индексами, выбираю в phpmyadmin столбец для которого я уже создал index, и могу создать для него еще один index, а потом еще один, из этого следует, что для одного столбца я могу создать кучу индексов? И добавление происходит такой командой
CODE (SQL):
скопировать код в буфер обмена
  1. ALTER TABLE  `some_table` ADD INDEX (  `source_id` ) ;
На сколько я понимаю создается index без имени, и это меня еще больше запутывает...
5. А вот такой код уже мне дает ошибку:
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. CREATE INDEX source_index ON some_table(source_id)
  3.  

говорит, что такой индекс уже есть, а зачем тогда давать имена индексам? если они и без имен вполне могут создаваться? Где используется имя индекса?
6. При удалении таблицы в которой есть индексы, индексы удаляются вместе с таблицей, или же их нужно дополнительно удалять?
2. Мелкий - 15 Февраля, 2016 - 15:58:53 - перейти к сообщению
1. Первичный и уникальный ключи - те же самые btree индексы + ограничение уникальности.
2. Никакого
3. http://dev[dot]mysql[dot]com/doc/refman/[dot][dot][dot]/show-index[dot]html
4. да, индексов можно создавать много. Другое дело, что два одинаковых индекса бесполезны и только мешают как планировщику, так и замедляют запись
Индекс создаётся с именем, просто имя генерируется автоматически.
5. Имя индекса используется в explain. Ещё в хинтах, но ими всё равно лучше не пользоваться. А, и удаляются индексы по имени.
6. удалятся вместе с таблицей
(Добавление)
Кстати, mysql 5.7.11:
Цитата:
mysql> alter table billing add index(user_id);
Query OK, 0 rows affected (0,01 sec)
Records: 0 Duplicates: 0 Warnings: 0

mysql> alter table billing add index(user_id);
Query OK, 0 rows affected, 1 warning (0,01 sec)
Records: 0 Duplicates: 0 Warnings: 1

mysql> show warnings;
+---------+------+---------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------------------------------------------------------------------------------------------------+
| Warning | 1831 | Duplicate index 'user_id_2' defined on the table 'test.billing'. This is deprecated and will be disallowed in a future release. |
+---------+------+---------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0,00 sec)

mysql> create index nameindex on billing(user_id);
Query OK, 0 rows affected, 1 warning (0,01 sec)
Records: 0 Duplicates: 0 Warnings: 1

mysql> show warnings;
+---------+------+---------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------------------------------------------------------------------------------------------------+
| Warning | 1831 | Duplicate index 'nameindex' defined on the table 'test.billing'. This is deprecated and will be disallowed in a future release. |
+---------+------+---------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0,00 sec)

3. exlant - 15 Февраля, 2016 - 16:03:42 - перейти к сообщению
Спасибо за быстрый ответ!

Я правильно понял?
1. Значит и для уникального ключа нет нужды создавать индекс?
2. Нет смысла давать индексу имя?
4. Мелкий - 15 Февраля, 2016 - 16:10:44 - перейти к сообщению
1. Да, не нужно.
2. Есть. explain воспринимать проще. Можно и таблицам имена давать невнятные, СУБД-то всё равно.
5. exlant - 15 Февраля, 2016 - 16:13:21 - перейти к сообщению
Огромное спасибо)

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SHOW {INDEX | INDEXES | KEYS}
  3.     {FROM | IN} tbl_name
  4.     [{FROM | IN} db_name]
  5.     [WHERE expr]
  6.  

Этот код мне многое прояснил!

 

Powered by ExBB FM 1.0 RC1