Рекомендация NoSQL для конкретной потребности - PullRequest
2 голосов
/ 13 июля 2011
  • Я использую таблицу MySql со следующей простой структурой:

    ID_A: int 8

    ID_B: int 8

    Первичный ключ: ID_A, ID_B Индекс: ID_B

  • Эта таблица MySQL содержит более 500 миллионов строк, а вес составляет 20Go.

  • Мне нужночтобы выполнить запрос такого типа:

    select *,count(*) as cpt from table group by ID_A order by cpt DESC
    
    select *,count(*) as cpt from table group by ID_B order by cpt DESC
    
    select * from table where ID_A in (1,2,3,4,5,5) 
    
    select * from table where ID_B in (1,2,3,4,5,5) 
    
    select *,count(*) as cpt from table where ID_B in (1,2,3,4,5) group by ID_A order by cpt DESC
    
    select *,count(*) as cpt from table where ID_A in (1,2,3,4,5) group by ID_B order by cpt DESC
    
  • Я пробовал innodb и MyIsam, но даже с большим сервером конфигурации mysql не может ответить на запрос Group By.Я даже не могу сделать это со стороны сценария, потому что это потребовало бы много памяти.

Все данные не могут поместиться в оперативной памяти (20Go сегодня, но 60Go в ближайшембудущее).

Должны ли мы использовать базу данных NoSql?MongoDB?Карта уменьшить БД?

Спасибо за помощь

Ответы [ 2 ]

0 голосов
/ 13 июля 2011

выберите , считайте () как cpt из группы таблиц по порядку ID_A по cpt DESC

err, что будет анализировать - но это очень плохой стиль программирования,Я даже не уверен, что он вернет.

Я подозреваю, что это не будет намного быстрее в системе NoSQL, если у вас нет большого количества параллелизма и вы можете распределить нагрузку между несколькими серверами (чтовы могли бы также сделать с MySQL).Поэтому вам, вероятно, придется взглянуть на sharding / map-Reduce, чтобы распараллелить запросы (опять-таки подразумевая наличие нескольких серверов).

Оставляя в стороне странный SQL, почему бы просто не денормализовать ваши данные - добавьте таблицы для ID_A и ID_BСчитает, затем устанавливает триггер для существующей таблицы, чтобы заполнить данные новыми таблицами.

0 голосов
/ 13 июля 2011

Я никогда не использовал MongoDB для больших данных, но для более чем 10 000 ключей вы можете использовать карту / уменьшение mongoDB вместо groupBy по умолчанию.

Вы можете найти здесь документацию mongoDB для этого:

mongoDB groupBy для более крупной операции группировки

Надеюсь, что это может помочь

...