Если вы обычно извлекаете все (или большинство) данных для одного идентификатора сущности, вам следует рассмотреть возможность сделать индекс просто идентификатором сущности, а не (entity_id, date_id) - если только вам не нужна база данных для уникальных проверок.
Эффект заключается в уменьшении индекса, чтобы вы могли получить больше его в памяти. Ваша цель должна состоять в том, чтобы индекс был в памяти. Даже если вам нужно выполнить SELECT..ORDER BY DATE, вы обнаружите, что MySQL может упорядочивать 3650 значений за доли секунды на лету (без индекса). Эта проблема - время чтения строк с диска.
Однако ваша основная проблема с производительностью заключается в том, что INSERT приводит к тому, что данные для одного объекта распределяются по диску, что требует доступа к диску для каждого (объект, дата), что заставит ваш запрос выполняться со скоростью несколько сотен строк в секунду. Ваше разбиение не поможет в этом, потому что каждый объект находится в одном разделе, а строки распределены по его диску. (RAID0 на дисках немного поможет).
Чтобы получить эффективный поиск, вам нужно получить данные для смежного объекта на диске, что означает переупорядочение данных из порядка INSERT. Вы можете сделать это с помощью MySQL ALTER TABLE .. ORDER BY ... но это займет вечность. У меня была таблица строк размером 182M, которая выполняла команду ALTER TABLE .. ORDER BY в течение последних 2 недель, и она еще не завершена.
Вот почему я написал собственный движок хранения!
Кстати, я не уверен, что вы вообще что-то получаете, разбивая на разделы, если только вы не разбиваете на несколько серверов или хотя бы на несколько дисков. Тяжелая работа, которую должен выполнить MySQL, не упрощается путем разбиения. Это все о времени доступа к диску.
Помещение каждого раздела на другой диск может помочь. Я бы не имел вдвое больше разделов, чем у вас физических дисков. 2 раза, а не 1, дадут некоторые преимущества очередей, но я сомневаюсь, что это окажет большое влияние. Я сомневаюсь, что вы получаете намного лучше, чем одна таблица без разделов, использующая RAID0 на любом количестве дисков.
Производительность этого приложения определяется количеством обращений к диску и поэтому помогает, если вы можете выполнять больше обращений в секунду.
Вы получаете некоторый параллелизм обработки (при условии, что у вас есть несколько процессоров) с секционированием, но ваша система будет связана с вводом / выводом, а не с процессором. Если вы используете процессор более 2%, вы, вероятно, делаете то, что вам не нужно (или что-то, что не является вашим приложением).
Я писал, оптимизировал и управлял этим видом приложений в течение девяти лет, используя MySQL ... и у меня есть все шрамы, которые вы могли ожидать от опыта. Когда ваши данные значительно превышают размер вашей памяти (что я и определяю как «огромный»), проблема с производительностью будет Дисковый ввод / вывод , что означает первичное число поиск дисков . Удачи !!