Разделение MySQL против перехода на MangoDB

У нас есть 4 довольно большие таблицы в базе данных MySQL. Они около 50, 35, 6 и 5 Гб, остальные таблицы не такие большие. Эти таблицы полны аналитических данных, которые добавляются задачами cron каждые 10 минут. Эти таблицы будут продолжать расти со временем.

Вот схема данных

CREATE TABLE `instpld` (
  `id` int(20) NOT NULL AUTO_INCREMENT,
  `insID` varchar(100) NOT NULL,
  `dbID` int(10) NOT NULL,
  `type` varchar(1) NOT NULL,
  `timestamp` int(11) NOT NULL,
  `count` text NOT NULL,
  `comment_count` int(10) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `insID` (`insID`(50)),
  KEY `dbID` (`dbID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Я понимаю, что типы полей могут быть намного лучше. Вопрос в том, что лучше - добавить несколько разделов на стол или переключить все на MangoDB, потому что это быстрее?

Я ищу плюсы и минусы каждого варианта.

# Misc Settings
# -------------
datadir=/var/lib/mysql
tmpdir=/var/lib/mysqltmp
socket=/var/lib/mysql/mysql.sock
#skip-locking
skip-name-resolve
#table_cache=2048
thread_cache_size=16
back_log=100
max_connect_errors=10000
open-files-limit=20000
interactive_timeout=3600
wait_timeout=600
#max_connections=200
# Added to prevent DNS lookups from causing performance issues
skip-name-resolve

# Set this to change the way MySQL handles validation, data
# conversion, etc. Be careful with this setting as it can
# cause unexpected results and horribly break some applications!
# Note, too, that it can be set per-session and can be hard set
# in stored procedures.
#sql_mode=NO_ENGINE_SUBSTITUTION

# Slow Query Log Settings
# -----------------------
#log-slow-queries=/var/lib/mysqllogs/slow-log
#long_query_time=2
#log-queries-not-using-indexes

# Global, Non Engine-Specific Buffers
# -----------------------------------
max_allowed_packet=16M
tmp_table_size=64M
max_heap_table_size=64M

# Generally, it is unwise to set the query cache to be
# larger than 64-128M as this can decrease performance
# since the penalty for flushing the cache can become
# significant.
query_cache_size=32M
skip-name-resolve

# Set this to change the way MySQL handles validation, data
# conversion, etc. Be careful with this setting as it can
# cause unexpected results and horribly break some applications!
# Note, too, that it can be set per-session and can be hard set
# in stored procedures.
#sql_mode=NO_ENGINE_SUBSTITUTION

# Slow Query Log Settings
# -----------------------
#log-slow-queries=/var/lib/mysqllogs/slow-log
#long_query_time=2
#log-queries-not-using-indexes

# Global, Non Engine-Specific Buffers
# -----------------------------------
max_allowed_packet=16M
tmp_table_size=64M
max_heap_table_size=64M

# Generally, it is unwise to set the query cache to be
# larger than 64-128M as this can decrease performance
# since the penalty for flushing the cache can become
# significant.
query_cache_size=32M

# Per-Thread Buffers
# ------------------
sort_buffer_size=1M
read_buffer_size=1M
read_rnd_buffer_size=8M
join_buffer_size=1M
key_buffer_size=64M

# This setting controls the size of the buffer that is allocated when
# sorting MyISAM indexes during a REPAIR TABLE or when creating indexes
# with CREATE INDEX or ALTER TABLE.
myisam_sort_buffer_size=64M

# InnoDB
# ------
# Note: While most settings in MySQL can be set at run-time, InnoDB
# variables require restarting MySQL to apply.

# If the customer already has InnoDB tables and wants to change the
# size of the InnoDB tablespace and InnoDB logs, then:
# 1. Run a full backup with mysqldump
# 2. Stop MySQL
# 3. Move current ibdata and ib_logfiles out of /var/lib/mysql
# 4. Uncomment the below innodb_data_file_path and innodb_log_file_size
# 5. Start MySQL (it will recreate new InnoDB files)
# 6. Restore data from backup
#innodb_data_file_path=ibdata1:2000M;ibdata2:10M:autoextend
innodb_log_file_size=100M

innodb_buffer_pool_size=2G

........

2 ответа

У вас есть 128 ГБ, используйте его! innodb_buffer_pool_size=2G - изменить около 70% оперативной памяти.

Держу пари, ты не можешь показать мне EXPLAIN который использует KEY instaID (instaID(50)), Индексы префиксов почти всегда не используются.

Включите slowlog, соберите некоторые данные, запустите pt-query-digest и покажите нам "худший" запрос. Предоставлять EXPLAIN SELECT ... для этого.

id int(20) NOT NULL AUTO_INCREMENT, - Надеюсь, вы не ожидаете 20-значных номеров. Это будет максимум чуть более 2 миллиардов.

Если мы не сможем оптимизировать ваши запросы, мы перейдем к методам хранилищ данных, таким как сводные таблицы - они, как правило, ускоряются в 10 раз.

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

Помните, что у Innodb есть некоторые проблемы с размером, если вы не оптимизируете таблицу время от времени.

Другие вопросы по тегам