Это первый раз, когда я приближаюсь к ситуации чрезвычайно большого объема. Это рекламный сервер на базе MySQL. Однако используемый запрос включает множество операций JOIN и, как правило, просто медленный. (Кстати, это Rails ActiveRecord)
sel = Ads.find(:all, :select => '*', :joins => "ПРИСОЕДИНЯЙТЕСЬ к кампаниям ПО ads.campaign_id = кампании.id ПРИСОЕДИНЯЙТЕСЬ к пользователям ПО кампаниям.user_id = users.id ВЛЕВО ПРИСОЕДИНЯЙТЕСЬ к странам ПО странам.campaign_id = кампании.id ЛЕВАЯ СОЕДИНЯЙТЕ ключевые слова ВКЛ. keywords.campaign_id = кампании.ид", :условия => [flashstr + "keywords.word = ? И ads.format = ? И кампании.cenabled = 1 И (countries.country IS NULL ИЛИ страны .country = ?) И ads.enabled = 1 И кампании.dailyenabled = 1 И users.uenabled = 1", kw, format, viewer['country'][0]], :order => order, :limit => лимит)
Мои вопросы:
Есть ли альтернативная база данных, такая как MySQL, которая поддерживает JOIN, но работает намного быстрее? (Я знаю, что Postgre все еще оценивает его.)
В противном случае поможет ли запуск экземпляра MySQL, загрузка локальной базы данных в память и повторная загрузка каждые 5 минут?
В противном случае, есть ли способ переключить всю эту операцию на Redis или Cassandra и каким-то образом изменить поведение JOIN, чтобы оно соответствовало природе NoSQL (не способной к JOIN)?
Благодарю вас!
РЕДАКТИРОВАТЬ: вот более подробная информация:
Полностью выполненный SQL с плоским выбором (усеченный выше):
ВЫБЕРИТЕ кампании.id, кампании.guid, кампании.user_id, кампании.dailylimit, кампании.показы, кампании.cenabled, кампании.dayspent, кампании.dailyenabled, кампании.fr, ads.id, ads.guid, ads.user_id, объявления .campaign_id, ads.format, ads.enabled, ads.datafile, ads.data1, ads.data2, ads.originalfilename, ads.aid, ads.impressions, country.id, country.guid, country.campaign_id, country.country , keywords.id, keywords.campaign_id, keywords.word, keywords.bid ИЗ
ads
ПРИСОЕДИНЯЙТЕСЬ к кампаниям ВКЛ ads.campaign_id = кампании.ид ПРИСОЕДИНЯЙТЕСЬ к пользователям ВКЛ кампании.user_id = users.id ВЛЕВО ПРИСОЕДИНЯЙТЕСЬ к странам ВКЛ Country.campaign_id = кампании.ид ВЛЕВО ПРИСОЕДИНЯЙТЕСЬ к ключевым словам ON keywords.campaign_id = кампании.id ГДЕ (keywords.word = 'дизайн' И ads.format = 10 И кампании.cenabled = 1 И (countries.country IS NULL ИЛИ country.country = 82) И ads.enabled = 1 И кампании.dailyenabled = 1 И пользователи.uenabled = 1 И ads.datafile != '') ORDER BY keywords.bid DESC LIMIT 1,1
ОБЪЯСНИТЬ/план выполнения:
+----+-------------+-----------+--------+------------------+-------------+---------+------------------------------------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+--------+------------------+-------------+---------+------------------------------------+------+----------------------------------------------+
| 1 | SIMPLE | keywords | ref | campaign_id,word | word | 257 | const | 9 | Using where; Using temporary; Using filesort |
| 1 | SIMPLE | ads | ref | campaign_id | campaign_id | 4 | e_development.keywords.campaign_id | 8 | Using where |
| 1 | SIMPLE | campaigns | eq_ref | PRIMARY | PRIMARY | 4 | e_development.keywords.campaign_id | 1 | Using where |
| 1 | SIMPLE | users | eq_ref | PRIMARY | PRIMARY | 4 | e_development.campaigns.user_id | 1 | Using where |
| 1 | SIMPLE | countries | ALL | campaign_id | NULL | NULL | NULL | 4 | Using where |
+----+-------------+-----------+--------+------------------+-------------+---------+------------------------------------+------+----------------------------------------------+
(это в базе данных разработки, в которой не так много строк, как в производственной версии.)
ОПРЕДЕЛЯЕМЫЕ ПОКАЗАТЕЛИ:
ads -> id (primary, autoinc) + aid (unique) + campaign_id (index) + user_id (index)
campaigns -> id (primary, autoinc) + user_id (index)
countries -> id (primary, autoinc) + campaign_id (index) + country (index) + user_id (index)
keywords -> id (primary, autoinc) + campaign_id (index) + word (index) + user_id (index)
user -> id (primary, autoinc)
SELECT *
только теми столбцами, которые вам нужны, и убедитесь, что у вас есть правильные индексы (посмотрите на план выполнения для сканирования) - person KM.   schedule 15.06.2010