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 :: вопрос по индексам в mysql

 PHP.SU

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


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

> Без описания
exlant
Отправлено: 15 Февраля, 2016 - 15:41:00
Post Id



Посетитель


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


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




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

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. При удалении таблицы в которой есть индексы, индексы удаляются вместе с таблицей, или же их нужно дополнительно удалять?

(Отредактировано автором: 15 Февраля, 2016 - 15:45:14)

 
 Top
Мелкий Супермодератор
Отправлено: 15 Февраля, 2016 - 15:58:53
Post Id



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


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


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




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)



-----
PostgreSQL DBA
 
 Top
exlant
Отправлено: 15 Февраля, 2016 - 16:03:42
Post Id



Посетитель


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


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




Спасибо за быстрый ответ!

Я правильно понял?
1. Значит и для уникального ключа нет нужды создавать индекс?
2. Нет смысла давать индексу имя?
 
 Top
Мелкий Супермодератор
Отправлено: 15 Февраля, 2016 - 16:10:44
Post Id



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


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


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




1. Да, не нужно.
2. Есть. explain воспринимать проще. Можно и таблицам имена давать невнятные, СУБД-то всё равно.


-----
PostgreSQL DBA
 
 Top
exlant
Отправлено: 15 Февраля, 2016 - 16:13:21
Post Id



Посетитель


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


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




Огромное спасибо)

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

Этот код мне многое прояснил!
 
 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