О производительности базы данных - PullRequest
0 голосов
/ 12 июля 2010

Доброе утро,

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

У меня есть плоская база данных в MySQL, которая изначально состояла из следующих полей

  1. Дата (дата)
  2. Имя (VARCHAR (50))
  3. Значение (DOUBLE)

ПК таблицы был составным из столбцов 1 и 2.

Дело в том, что вскоре у меня было более 40 миллионов строк, и мои запросы ко всем записям по одному имени принимали годы.

Следовательно, я решил создать «индексную таблицу» (я думаю, что терминология верна), где я храню отображение между Именами и идентификаторами:

  1. ID (INT)
  2. Имя (VARCHAR 50)

И я изменил свою исходную таблицу на

  1. Дата (дата)
  2. ID (INT)
  3. Значение (DOUBLE)

Таким образом, я мог сначала найти идентификатор искомой записи, а затем очень быстро выполнить запрос к большой таблице (производительность была действительно намного лучше).

Я предполагаю, что это потому, что сравнение между целыми числами намного проще, чем между символьными строками, но я искал некоторую литературу, чтобы поддержать эту оценку (в идеале некоторую книгу по структуре базы данных).

Как вы думаете, моя оценка верна?

Ответы [ 3 ]

1 голос
/ 12 июля 2010

Если предположить, что данные поля "Имя" имеют много дубликатов, производительность вашего запроса улучшится, поскольку целочисленные сравнения выполняются быстрее, чем сравнения строк, и вы значительно сократили размер таблицы дат.Это означает меньше подкачки памяти и меньше дискового поиска.

Если таблица имен содержит N строк, то вы выполняете N сравнений строк, плюс 40 миллионов целочисленных сравнений вместо 40 миллионов сравнений строк.Чтобы еще больше повысить производительность запросов, необходимо добавить индекс для поля идентификатора таблицы дат.

CREATE INDEX date_id_index ON date_table (ID)
1 голос
/ 12 июля 2010

Что касается книг, "Прикладная математика для специалистов по базам данных" Лекса де Хаана и Туна Коппелаарса - действительно хорошая книга, если вы хотите продвинутых знаний SQL.Я должен отметить, что вы не просто «упоминаете» книги, вы читаете их и используете их в качестве справочных - просто ссылаетесь на книги, потому что они звучат круто, но не читая их, вернетесь, чтобы укусить вас в задницу.

1 голос
/ 12 июля 2010

Частично проблема заключается в том, что составные ключи (например, ваша дата, имя PK) создаются путем объединения индексированных значений (см. http://dev.mysql.com/doc/refman/5.1/en/create-index.html), и имени (основное, что вы ищите здесь) второй. Это делает намного более трудным поиск вещей по имени, потому что индекс не будет отсортирован по имени - он будет отсортирован по дате, затем по имени, что означает, что mysqld должен будет искать весь индекс вместо просто захватывая раздел, где ПК находится между "Джек, 0000-00-00" и "Джек, 9999-12-31".

Если вы добавили индекс только для имени или хотя бы переключили ПК на (Имя, Дата), вы, вероятно, обнаружите, что ваша исходная таблица работает намного лучше.

В качестве альтернативы, если вы сделали то же самое со своей таблицей Date, ID, она все равно должна быть быстрее, потому что вы почти исключаете сравнение строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...