Запрашиваемые данные в MySQL - PullRequest
9 голосов
/ 04 июня 2011

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

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

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

Существуют ли сторонние программы, которые могут управлять осколками и моими запросами? Или я должен изменить свой код (который написан на php) для взаимодействия с заштрихованными данными?

Ответы [ 3 ]

6 голосов
/ 15 ноября 2012

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

например. select * from t1 было преобразовано в:

select * from db1.t1
union
select * from db2.t2

и т.д.

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

Скажем, например, что вы проводите анализ сети и вам нужно объединить таблицы, чтобы определить «ссылки» атрибутов пользователей.

Вы можете получить странные запросы, которые выглядят примерно так (простите за синтаксис):

  select db1.user1.boss, db1.user1.name, db2.user.name db2.user.boss from db1 inner join on db1.user.name = db2.user.name

(например, получить начальника человека и его начальника или друга друзей и т. Д.)

Это может быть огромным PITA, когда вы хотите получить хорошие данные для выполнения цепных типов запросов, но для простых статистических данных, таких как суммы, средние значения и т. Д., Для этих ребят лучше всего работал ночной запрос с агрегированной статистикой. в таблицу на каждом сервере (например, nightlystats) .. например select countif(user.datecreated>yesterday,1,0) as dailyregistered, sumif(user.quitdate)... into (the new nightly record).

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

Мы закончили с индексированием и оптимизацией, и такие приемы, как хранение небольших локальных таблиц часто используемой информации, помогли ускорить запросы.

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

Есть несколько хитростей, которые могут уменьшить это, например, использование общих небольших таблиц (например, основных таблиц для пользователей и т. Д. Без изменения данных и т. Д.), Чтобы вам не приходилось тратить время на их сбор.

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

Последнее, что интересует, заключается в том, что для обхода проблемы bw нужно было запрограммировать тайм-аут «отсрочки» во внутреннем «агрегаторе запросов», то есть, когда он получал время ответа от выборки записи, если время начало откладываться, он будет запрашивать меньше записей и добавлять задержку к запросам, которые он запрашивал (поскольку он сообщал и не чувствителен ко времени, это работало нормально)

Есть несколько SQL, которые автоматически масштабируются, и я недавно прочитал статью об инструментах (но не php), которая сделает кое-что для вас. Я думаю, что они были связаны с провайдерами облачных VM.

В этой ветке также представлены некоторые инструменты и мысли: Подходы к шардингу MySQL?

Если NoSQL является опцией, вы можете рассмотреть все системы БД, прежде чем идти по этому пути.

Подход NoSQL может быть легче масштабировать в зависимости от того, что вы ищете.

4 голосов
/ 04 июня 2011
0 голосов
/ 06 февраля 2018

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

Предположим, что у вас есть таблица сотрудников, и эта таблица была очищена в соответствии с employee_id, а количество сегментов равно 10. Теперь данные в таблицах закрытых данных можно поместить в имя таблицы, например, employee_ (employee_id% 10). Таким образом, данные сотрудников будут занесены в таблицы с именами employee_1, employee_2 ..... employee_10 в соответствии с ключом шардинга.

Здесь mysql не будет автоматически вычислять имя таблицы, но вы должны делать это на языке, который вы используете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...