先貼出建表陳述句
CREATE TABLE `demo_table` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` bigint(20) NOT NULL DEFAULT '0',
`status` tinyint(1) NOT NULL DEFAULT '0',
`reward` int(11) NOT NULL DEFAULT '0',
`rules` varchar(255) NOT NULL DEFAULT '',
`created_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`sign_time` datetime DEFAULT NULL,
`replenish_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user_created_time` (`user_id`,`created_time`) USING HASH,
UNIQUE KEY `user_sign_time` (`user_id`,`sign_time`) USING BTREE,
KEY `user_id` (`user_id`) USING HASH,
KEY `created_time` (`created_time`) USING BTREE,
KEY `status` (`status`) USING BTREE,
KEY `status_created_time` (`status`,`created_time`) USING BTREE,
KEY `sign_time` (`sign_time`) USING BTREE,
KEY `status_replenish_time` (`status`,`replenish_time`) USING BTREE,
KEY `replenish_time` (`replenish_time`) USING BTREE,
KEY `user_replenish_time` (`user_id`,`replenish_time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=66681184 DEFAULT CHARSET=utf8
表的資料量達到
查詢陳述句分析:
explain DELETE FROM `demo_table` WHERE `user_id` = 884308 AND `sign_time` <= '2018-04-20 09:36:51' AND `status` = 0
結果顯示只使用了status欄位,預期至少應該使用user_id欄位才符合我的想法,但可能由于通過status索引來掃描的原因,導致鎖了許多記錄,把別的用戶status=0也給鎖住了,別的用戶在別的請求里進行update時就報錯
我想過強制宣告使用user_id索引來解決,但還是希望先找出原因,通過調整條件的方式來防止對其他用戶記錄的鎖定,不知道為什么會決定使用了status,是不是我非要宣告FORCE INDEX?
表結構短時間內是不方便調整的了~
uj5u.com熱心網友回復:
把status欄位索引刪掉uj5u.com熱心網友回復:
沒見過你這樣所有欄位加索引的
uj5u.com熱心網友回復:
其實還有許多欄位沒貼出來,但那些欄位沒加索引。不過才醒起status不應該加索引啊,它的值只有6種。現在表已經有5千萬條記錄了,希望洗掉索引時不會鎖太久吧
uj5u.com熱心網友回復:
另外為什么會決定使用status的呀,我想知道原因uj5u.com熱心網友回復:
KEY `user_id` (`user_id`) USING HASH,改成 BTREE 試試
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/90948.html
標籤:MySQL
上一篇:mysql cluster ndb節點與sql節點問題及在線添加NDB節點
下一篇:請求優化啊,執行時間過長
