SQLinfo.ru - Все о MySQL Фестиваль «Российские интернет-технологии» 2017

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#26 15.05.2012 01:48:44

inkognitotester
Участник
Зарегистрирован: 15.05.2012
Сообщений: 12

Re: Использование составных индексов

paulus написал:

С одной стороны, лишний ключ не нужен. С другой стороны, все не-primary ключи содержат
в себе не ссылку на строку, а ссылку на primary, поэтому, если PK очень длинный, то все
остальные ключи становятся тоже очень длинными и, следовательно, начинают тормозить.

если Primary key составной, то куда ссылаются остальные ключи? если например остальных - 15(ключей), насколько это усложняет жизнь MySQL?(из ветки 5.1.62)

Неактивен

 

#27 15.05.2012 01:53:50

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3740

Re: Использование составных индексов

inkognitotester написал:

если Primary key составной, то куда ссылаются остальные ключи? если например остальных - 15(ключей), насколько это усложняет жизнь MySQL?(из ветки 5.1.62)

Каждый из остальных ключей будет содержать в каждой строчке значение составного первичного ключа. Это увеличит объем, занимаемый индексами и соответственно повлияет на производительность.

Неактивен

 

#28 15.05.2012 02:04:50

inkognitotester
Участник
Зарегистрирован: 15.05.2012
Сообщений: 12

Re: Использование составных индексов

rgbeast написал:

Каждый из остальных ключей будет содержать в каждой строчке значение составного первичного ключа. Это увеличит объем, занимаемый индексами и соответственно повлияет на производительность.

т.е. лучше в качестве primary создать быстрый и короткий ключ, а составной вынести в обычный индекс?

и чем плоха ситуация, когда в составном primary key первый ключ( Seq_in_index = 1) с Cardinality 25, а второй( Seq_in_index = 2 ) с Cardinality 12527361?

Неактивен

 

#29 15.05.2012 17:00:11

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3740

Re: Использование составных индексов

inkognitotester написал:

т.е. лучше в качестве primary создать быстрый и короткий ключ, а составной вынести в обычный индекс?

да

inkognitotester написал:

и чем плоха ситуация, когда в составном primary key первый ключ( Seq_in_index = 1) с Cardinality 25, а второй( Seq_in_index = 2 ) с Cardinality 12527361?

в общем ни чем не плоха, а в частности зависит от задачи.

inkognitotester, обратите внимание на формат цитирований на форуме

Неактивен

 

#30 28.08.2012 14:23:00

Cioxideru
Участник
Зарегистрирован: 28.08.2012
Сообщений: 2

Re: Использование составных индексов

Очень хорошая темаи качественное обсуждение.
Я ищу ответа на один вопрос который меня долго мучает.
Недавно я столкнулся с интересным подходом в проектировании бд.
Он заключался в том что у таблиц не было внешних ключей FK, зато у таблиц были сложные составные PK ключи.
Этакий специфичный способ нормализации. В моей практике я вижу такое впервые.
Для меня пока понятно одно что первичный ключь очень раздут и будет неприлично много памяти.
У меня вопрос зачем это? И как быстро это будет работаьь?

Ниже пример одной из таблиц. Из 11 полей -  являются PK.


delimiter $$

CREATE TABLE `MY_TABLE` (
  `Customer` char(1) NOT NULL,
  `Customer_uid` decimal(14,0) NOT NULL,
  `Customer_group_uid` decimal(12,0) NOT NULL,
  `key_db_type` char(2) NOT NULL,
  `key_db_instance` int(11) NOT NULL,
  `Customer_valid_for_seq` int(11) NOT NULL,
  `share_seq` smallint(6) NOT NULL,
  `social_site_code` char(2) NOT NULL,
  `date_processed` datetime NOT NULL,
  `short_comment` varchar(100) DEFAULT NULL,
  `return_link_hash` decimal(14,0) NOT NULL,
  PRIMARY KEY (
`Customer`,
`Customer_uid`,
`Customer_group_uid`,
`key_db_type`,
`key_db_instance`,
`Customer_valid_for_seq`,
`share_seq`)
) ENGINE=InnoDB$$
 

Неактивен

 

#31 28.08.2012 17:26:12

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3740

Re: Использование составных индексов

Такой первичный ключ будет работать как индекс только для определенных запросов. Возможно, автор не видел разницы между составным индексом и несколькими одиночными. Работать будет несколько медленнее, чем с нормальным первичным ключом.

Неактивен

 

#32 28.08.2012 18:13:14

Cioxideru
Участник
Зарегистрирован: 28.08.2012
Сообщений: 2

Re: Использование составных индексов

rgbeast написал:

Такой первичный ключ будет работать как индекс только для определенных запросов. Возможно, автор не видел разницы между составным индексом и несколькими одиночными. Работать будет несколько медленнее, чем с нормальным первичным ключом.

Помимо того что задействовать такой индекс будет достаточно сложно, он к тому же будет работать медленно и занимать большой объем дискового пространства - и даже больше чем сами данные.
Правильно ли я понял?
Меня больше всего смущает то что в индексе поля с разными типами и разной длинны, насколько это хуже если бы в индексе были только целочисленные поля.  Мржет быть нужно выбрать специфичный тип индекса - хеш?

Возможно решением будет добавить по этим полям уникальный индекс и сделать  сурогатный первичный ключь с автоинкрементом и всеми плюшками.

Т.е как минимум это решит возможную проблему которую хотел решить DBA - уникальность записи. И позволит программисту использовать таблицы без лишних телодвижений.

Вот и получается дилемма:
1 Подход с natural keys насколько он добавит overhead по сравнению с surogate keys подходом.
2 Как это будет работать при использовании реплик, шардов(явно в структуре таблицы заложена такая фича).

Неактивен

 

#33 28.08.2012 19:17:21

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3740

Re: Использование составных индексов

Длина индекса будет суммой длины данных - причем для varchar это будет фиксированная полная длина (если utf8, то varchar(100) это 300 байт). Можете посмотреть SHOW TABLE STATUS LIKE 'MY_TABLE' - там увидите объем данных и индекса. Наверное, наиболее простым будет сделать отдельное уникальное автоинкрементируемое поле и индекс по нему. Для шардов вроде бы удобнее, когда индекс целочисленный (но я не знаю структуру вашего приложения).

Неактивен

 

#34 27.01.2017 13:26:16

fantom
Участник
Зарегистрирован: 27.01.2017
Сообщений: 2

Re: Использование составных индексов

Здравствуйте!

Подскажите пожалуйста, если у меня есть tbl1 JOIN tbl2 ON tbl1.col1=tbl2.col1/tbl2.col2, то как лучше настроить индексы в tbl2? Отдельно col1 и col2, или двойной (col1, col2)? И если двойной, то важен ли в данном случае порядок и будет ли он работать при tbl1 JOIN tbl2 ON tbl1.col1=tbl2.col2*tbl2.col1, например?

Неактивен

 

#35 27.01.2017 13:45:00

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5130

Re: Использование составных индексов

в данных случаях индексы на tbl2 использоваться не будут

в 5.7 можно сделать индекс на генерируемую колонку

Неактивен

 

#36 27.01.2017 14:41:21

fantom
Участник
Зарегистрирован: 27.01.2017
Сообщений: 2

Re: Использование составных индексов

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

vasya написал:

в 5.7 можно сделать индекс на генерируемую колонку

А можно чуть подробнее?

Неактивен

 

#37 27.01.2017 14:50:19

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5130

Re: Использование составных индексов

создаете виртуальную колонку, индексируете и используете в запросе вместо tbl2.col1/tbl2.col2 или tbl2.col2*tbl2.col1

подробней есть в доке
https://dev.mysql.com/doc/refman/5.7/en … lumns.html
и
https://mariadb.com/kb/en/mariadb/virtu … d-columns/

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson