одна таблица против нескольких таблиц для миллионов записей - PullRequest
2 голосов
/ 15 апреля 2011

Вот сценарий, старая база данных имеет такой дизайн

dbo.Table1998
dbo.Table1999
dbo.Table2000
dbo.table2001
...
dbo.table2011

и я объединил все данные с 1998 по 2011 в эту таблицу dbo.TableAllYears

теперь они оба проиндексированы "номером приложения" и имеют одинаковое количество столбцов (на самом деле 56 столбцов ..)

сейчас, когда я пытался

select * from Table1998

и

select * from TableAllYears where Year=1998 

первый запрос содержит 139669 строк при 13 секундах в то время как второй запрос имеет то же количество строк, но @ 30 секунд

так что для вас, ребята, я просто что-то упустил или несколько таблиц лучше, чем одна?

Ответы [ 4 ]

2 голосов
/ 15 апреля 2011

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

0 голосов
/ 15 апреля 2011

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

Так что в этом случае добавьте новый индекс для поля Год.

0 голосов
/ 15 апреля 2011

Я считаю, что вы должны использовать одну таблицу.Неизбежно, вам придется запрашивать данные за несколько лет, и разделение их на несколько таблиц является проблемой.Вполне возможно оптимизировать ваш запрос и структуру таблицы так, чтобы вы могли иметь много миллионов строк в таблице и при этом иметь отличную производительность.Убедитесь, что ваш столбец года проиндексирован и включен в ваши запросы.Если вы действительно достигли ограничений по размеру данных, вы можете использовать функциональность секционирования в MySQL 5, которая позволяет хранить данные таблицы в нескольких файлах, как если бы это было несколько таблиц, при этом она выглядит как одна таблица.

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

0 голосов
/ 15 апреля 2011

Если вы ищете данные за 1998 год, тогда вам нужно иметь только данные за 1998 год в одной таблице. Это связано с тем, что базе данных не нужно «искать» записи, но она знает, что все записи в этой таблице относятся к 1998 году. Попробуйте добавить предложение «WHERE Year = 1998» в таблицу Table1998, и вы должны получить немного лучшее сравнение.

Лично я хотел бы хранить данные в нескольких таблицах, особенно если это очень большой набор данных и вам не нужно часто выполнять запросы к старым данным. Даже если вы это сделаете, вы, возможно, захотите взглянуть на создание представления со всеми данными таблицы и запуск отчетов по нему вместо необходимости запрашивать несколько таблиц.

...