2016-06-19 9 views
0

Возможно, я слишком скоро спустился по пути оптимизации, и потерялся. Я записываю все возможные действия в игровом дереве настольной игры. У меня мало надежды завершить дерево, так как он станет таким большим (10^28), но, если возможно, захотите получить хороший кусок. В ожидании медленных запросов я разбиваю таблицы на ~ 50 ветвей дерева с суффиксами, описывающими каждую ветвь.следует разбить таблицу mysql, использовать механизм слияния, master/slave или что-то еще?

К сожалению, в моем приложении много сообщений, писем, обновлений и соединений, поэтому все быстро стало медленным, прежде чем я их разложил. С тех пор я также добавил некоторые очень полезные индексы, которые могли бы решить начальную медлительность. Однако по мере того, как приложение развивается, становится все сложнее переключаться между множеством таблиц с более сложными объединениями. Недавно я слышал об использовании мастер-подчиненного устройства, а также механизма слияния, чтобы помочь с большими таблицами. Я выбрал неправильное решение для своей проблемы или должен ли я просто это испортить?

+2

Вы можете использовать разбиение на разделы для своих таблиц, если вы не хотите менять приложение. если в этом случае индекс создается для каждого раздела, и вы также можете его использовать. Вы также можете отказаться от partion, то есть со старыми данными и так далее: https://mariadb.com/kb/en/mariadb/partitioning-overview/ –

+2

Я бы спустился по маршруту Catus Kev в своем оценщике покера. http://suffe.cool/poker/evaluator.html может быть много уникальных ходов, но есть ли много разных? Резка данных будет ключевой. – exussum

+1

В этом случае вряд ли слияние и разделение могут быть вашим другом ... но что именно вы храните (потенциально) 10^28 из, и как оно используется? –

ответ

1

10^28 строк или что-либо еще, если прямо, невозможно. Рассчитайте стоимость этого большого дискового пространства; это должно вас напугать. Вам нужно сосредоточиться на «обрезке» ваших деревьев.

PARTITIONing выглядит заманчиво, но он по своей сути не обеспечивает каких-либо преимуществ в производительности (за редким исключением). То же самое для ручного разбиения на 50 таблиц. MERGE - это всего лишь старый вариант PARTITION. Репликация может помочь для читать масштабирование. Sharding (разделение данных на нескольких машинах) может помочь, но добавляет к стоимости и сложности - и до сих пор не достанется вам 10^28.

Если вы предоставите SHOW CREATE TABLE и некоторые из запросов, мы можем обсудить оптимизацию, бит, индексирование и т. Д., Методы. Это может помочь вам.

Вы используете 64-бит BIGINT UNSIGNED для отслеживания вещей на плате 8x8? И используя логическую арифметику для манипулирования ими? В некоторых ситуациях это может значительно уменьшить дисковое пространство, количество необходимых запросов и т. Д.

+0

Спасибо за ваш ответ! Вот «SHOW CREATE TABLE» на одной из таблиц перемещенных вручную перемещений: http://pastebin.com/8TbZ4TZU Я вернул свои таблицы разделенных вручную вручную игр в одну таблицу игр, которая выглядит так: http: // pastebin. com/EQFmYmLW – okwme

+0

Будет ли использоваться 64-разрядный 'BIGINT UNSIGNED' для первичного идентификатора? Я еще не получил числа в любом месте 10^28 и не хочу слишком быстро оптимизировать, но хотел бы иметь приблизительный план, когда числа начинают становиться большими.Я также решил избавиться от идентификатора int, так как столбец перемещений (хотя «varchar») уникален. Может быть, есть способ конвертировать 'varchar' в уникальный int, поскольку они используют только A-B & 1-8? – okwme

+1

Используйте 'SMALLINT' (2 байта) и' MEDIUMINT' (3 байта) везде, где это практически возможно - для экономии места. Используйте 'UNSIGNED' в большинстве ситуаций. 64 столбца 'a1'..'h8' - что представляет собой' INTs'? –