Запросы к тысячам баз данных MySQL с одинаковой схемой - PullRequest
0 голосов
/ 28 октября 2011

У меня есть проблема, которую я царапал себе голову последние пару месяцев.У меня десятки тысяч баз данных MySQL на одном сервере, все с одной схемой.Я хочу быть в состоянии сделать запрос по всем из них и получить список результатов.В настоящее время я использую PHP-скрипт для обхода каждой базы данных и выполнения запроса для каждой из них.Иногда это может занять очень много времени (10+ минут), поэтому это, очевидно, не лучшее решение.

Вот пример того, что я хотел бы сделать:

SELECT something FROM db_prefix_*.tablename WHERE something = 1;

... и он вернет один набор результатов, db_prefix_ * - имя базы данных.

Существует ли что-то подобное или я мечтаю?

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

Ответы [ 4 ]

1 голос
/ 16 февраля 2012

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

1 голос
/ 28 октября 2011

Это то, что вы ищете:

DECLARE @sqlQuery nvarchar(MAX)
SET @sqlQuery=''
select @sqlQuery=@sqlQuery+'select something from '+ SCHEMA_NAME  +'.tableName' from INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME LIKE 'db_prefix_%'
print @sqlQuery
EXEC sp_executeSQL @sqlQuery

Я пришел из SQL-сервера и изо всех сил пытался перевести MySQL, пожалуйста, исправьте меня, если что-то здесь не так.

0 голосов
/ 29 октября 2011

Короткий ответ - нет: все драйверы php mysql (afaik) обрабатывают подключения к базам данных независимо, как вы уже делаете, просматривая их. Даже если бы был какой-то драйвер, который позволял использовать нужный вам синтаксис, я уверен, что он все равно будет создавать новое соединение для каждой базы данных на каком-то уровне из-за самого mysql.

Длинный ответ - да: вы можете построить индекс по нескольким базам данных. Наличие одной и той же схемы для нескольких баз данных, по сути, является осколком, так что это известная проблема (хотя неединственность первичного ключа может быть проблемой). Если вы создадите индекс в something для нескольких баз данных, вы сможете получить производительность в реальном времени, особенно если вам нужны только значения индексированных полей. Твиттер сообщает об успехе с индексами по таблицам mysql на раннем этапе (http://engineering.twitter.com/2011/05/engineering-behind-twitters-new-search.html)), поэтому есть обнадеживающий прецедент. Раздробление mysql было (возможно) более продуктивным в сообществе Rails, чем в сообществе PHP (http://planet.mysql.com/?tag_search=2013), поэтому вы можете найти там несколько указателей.

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

0 голосов
/ 28 октября 2011

Вы можете попробовать Parallel :: ForkManager , который предоставляет «Простой диспетчер параллельной обработки» для perl.

Вы можете изменить максимальное количество процессов вверх и вниз в зависимости от того, насколько тяжелым является запрос, а также использовать команду nice / ionice для предотвращения чрезмерной нагрузки на сервер.

Пока у вас версия 0.7.6 или более поздняя, ​​вы можете передавать структуры данных обратно в родительский процесс, что позволит вам постобработать результаты (например, показать сводку).

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