Обработка очень больших данных с помощью MySQL

Простите за длинный пост!

У меня есть база данных, содержащая ~ 30 таблиц (двигатель InnoDB). Только две из этих таблиц, а именно, «транзакция» и «сдвиг», достаточно велики (первая имеет 1,5 миллиона строк, а сдвиг - 23 тысячи строк). Теперь все работает нормально, и у меня нет проблем с текущим размером базы данных.

Тем не менее, у нас будет похожая база данных (те же типы данных, дизайн и т. Д.), Но гораздо больше, например, таблица «транзакции» будет иметь около1 миллиард записей (около 2,3 миллиона транзакций в день) и мы думаем о том, как нам поступить с таким объемом данных в MySQL? (интенсивно читать и писать). Я прочитал много связанных постов, чтобы увидеть, может ли Mysql (а точнее, движок InnoDB) работать хорошо с миллиардами записей, но все же у меня есть некоторые вопросы. Некоторые из тех связанных сообщений, которые я прочитал, находятся в следующем:

Может ли MySQL разумно выполнять запросы на миллиарды строк?Является ли InnoDB (MySQL 5.5.8) правильным выбором для многомиллиардных строк?Лучшее хранилище данных для миллиардов строкНасколько большой может быть база данных MySQL до того, как производительность начнет снижатьсяПочему MySQL может работать медленно с большими таблицами?Может ли Mysql обрабатывать таблицы, которые будут содержать около 300 миллионов записей?

Что я понял до сих пор, чтобы улучшить производительность для очень больших таблиц:

(для таблиц innoDB, в моем случае) увеличениеinnodb_buffer_pool_size (например, до 80% оперативной памяти). Кроме того, я нашел некоторые другие параметры настройки производительности MySQLздесь, в блоге Perconaиметь правильные индексы в таблице (используя EXPLAN для запросов)разделение таблицыMySQL Sharding или кластеризация

Вот мои вопросы / путаницы:

Что касается разбиения, у меня есть некоторые сомнения, стоит ли нам его использовать или нет. С одной стороны, многие люди предложили улучшить производительность, когда таблица очень большая. С другой стороны, я прочитал много сообщений о том, что это не улучшает производительность запросов и не ускоряет выполнение запросов (например,Вот а такжеВот). Также я читаю вСправочное руководство по MySQL тотВнешние ключи InnoDB и MySQL не совместимы (у нас есть внешние ключи).

Что касается индексов, сейчас они работают хорошо, но, насколько я понял, для очень больших таблиц индексация более ограничительна (как упомянул Кевин Беделл в своем ответе).Вот). Кроме того, индексы ускоряют чтение, а замедляют запись (вставка / обновление). Итак, для нового аналогичного проекта, который будет иметь эту большую БД, мы должны сначала вставить / загрузить все данные, а затем создать индексы? (чтобы ускорить вставку)

Если мы не можем использовать разбиение для нашей большой таблицы (таблицы «транзакций»), что является альтернативным вариантом для повышения производительности? (кроме настроек переменных MySQl, таких какinnodb_buffer_pool_size). Должны ли мы использовать кластеры Mysql? (у нас также есть много объединений)

РЕДАКТИРОВАТЬ

Этоshow create table оператор для нашей самой большой таблицы с именем «транзакция»:

  CREATE TABLE `transaction` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `terminal_transaction_id` int(11) NOT NULL,
 `fuel_terminal_id` int(11) NOT NULL,
 `fuel_terminal_serial` int(11) NOT NULL,
 `xboard_id` int(11) NOT NULL,
 `gas_station_id` int(11) NOT NULL,
 `operator_id` text NOT NULL,
 `shift_id` int(11) NOT NULL,
 `xboard_total_counter` int(11) NOT NULL,
 `fuel_type` int(11) NOT NULL,
 `start_fuel_time` int(11) NOT NULL,
 `end_fuel_time` int(11) DEFAULT NULL,
 `preset_amount` int(11) NOT NULL,
 `actual_amount` int(11) DEFAULT NULL,
 `fuel_cost` int(11) DEFAULT NULL,
 `payment_cost` int(11) DEFAULT NULL,
 `purchase_type` int(11) NOT NULL,
 `payment_ref_id` text,
 `unit_fuel_price` int(11) NOT NULL,
 `fuel_status_id` int(11) DEFAULT NULL,
 `fuel_mode_id` int(11) NOT NULL,
 `payment_result` int(11) NOT NULL,
 `card_pan` text,
 `state` int(11) DEFAULT NULL,
 `totalizer` int(11) NOT NULL DEFAULT '0',
 `shift_start_time` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `terminal_transaction_id` (`terminal_transaction_id`,`fuel_terminal_id`,`start_fuel_time`) USING BTREE,
 KEY `start_fuel_time_idx` (`start_fuel_time`),
 KEY `fuel_terminal_idx` (`fuel_terminal_id`),
 KEY `xboard_idx` (`xboard_id`),
 KEY `gas_station_id` (`gas_station_id`) USING BTREE,
 KEY `purchase_type` (`purchase_type`) USING BTREE,
 KEY `shift_start_time` (`shift_start_time`) USING BTREE,
 KEY `fuel_type` (`fuel_type`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1665335 DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT

Спасибо за ваше время,

Ответы на вопрос(2)

Ваш ответ на вопрос