2017-08-09 88 views
0

以下引发慢速查询日志。清除MYSQL缓慢查询日志 - Rails

APN::Notification. 
    select('apn_notifications.*, devices.device_uid'). 
    joins('INNER JOIN apn_devices ON (apn_notifications.device_id = apn_devices.id) INNER JOIN devices ON (apn_devices.device_id = devices.id)'). 
    where(['apn_notifications.sent_at IS NULL AND apn_notifications.badge > 0 AND devices.customer_id = ? AND devices.device_type IN (?)', customer.id, Object::Device.platform_device_types('ios')]) 

的输出EXPLAIN

EXPLAIN for: SELECT apn_notifications.*, devices.device_uid FROM `apn_notifications` INNER JOIN apn_devices ON (apn_notifications.device_id = apn_devices.id) INNER JOIN devices ON (apn_devices.device_id = devices.id) WHERE (apn_notifications.disabled_at IS NULL) AND (apn_notifications.sent_at IS NULL AND apn_notifications.badge > 0 AND devices.customer_id = 1 AND devices.device_type IN ('iphone4','ipad','iphone3')) 

'的输出显示创建表apn_notifications'

| apn_notifications | CREATE TABLE `apn_notifications` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`device_id` int(11) DEFAULT NULL, 
`errors_nb` int(11) DEFAULT NULL, 
`device_language` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
`sound` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
`alert` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL, 
`badge` int(11) DEFAULT NULL, 
`custom_properties` text COLLATE utf8_unicode_ci, 
`sent_at` datetime DEFAULT NULL, 
`disabled_at` datetime DEFAULT NULL, 
`created_at` datetime DEFAULT NULL, 
`updated_at` datetime DEFAULT NULL, 
PRIMARY KEY (`id`), 
KEY `index_apn_notifications_on_device_id` (`device_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=12984412 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci | 

的apn_notifications表中有150万条记录。所以,如果我尝试添加索引,它需要更长的时间。什么是从慢查询中删除此最佳方法?

另外从Mysql 5.6开始,添加索引不会导致任何停机。我对吗?

+0

你的问题是什么? – vijoc

+0

添加我的问题。 –

回答

0

我添加了以下索引,并减少了大量的时间。

add_index :apn_notifications, :sent_at 
add_index :apn_notifications, :badge 

注:已为外键

添加索引
1

往往是 “复合” 指标都比较好:

apn_notifications: INDEX(device_id, sent_at, badge) 
apn_notifications: INDEX(sent_at, badge) 
devices: INDEX(customer_id, device_type) 

apn_devices是许多一对多映射?如果是,请检查它是否遵循指导here