鍍金池/ 問答/數(shù)據(jù)庫(kù)/ mysql行鎖性能問題以及如何解決請(qǐng)求超時(shí)

mysql行鎖性能問題以及如何解決請(qǐng)求超時(shí)

表結(jié)構(gòu)

CREATE TABLE s_asset` (
rid int(11) NOT NULL AUTO_INCREMENT,
mtl_id int(11) NOT NULL COMMENT '材料id',
company_id int(11) NOT NULL COMMENT '分組Id',
amount int(11) NOT NULL DEFAULT '1' COMMENT '數(shù)量',
PRIMARY KEY (rid),
KEY uq_material_company (mtl_id,company_id) USING BTREE
)`

當(dāng)一個(gè)200多人的系統(tǒng)同時(shí)使用時(shí)候, 系統(tǒng)數(shù)據(jù)庫(kù)連接池使用50個(gè)連接,當(dāng)執(zhí)行,通過分析每秒查詢請(qǐng)求在300多個(gè),當(dāng)執(zhí)行以下sql時(shí),會(huì)花費(fèi)較長(zhǎng)時(shí)間, 直到50s超時(shí),show processlist 查看請(qǐng)求,只有這條sql使用了鎖,且不存在當(dāng)前表的更新與刪除請(qǐng)求,排除死鎖可能。
select count(0) as count from s_asset where mtl_id = '94' and company_id = 1 for update;

備注:開始mysql未做任何配置優(yōu)化,后面增加了pool size 和 查詢緩存,目測(cè)有所改善。

疑問:mysql 應(yīng)付如此數(shù)量的請(qǐng)求性能為何表現(xiàn)不佳,

回答
編輯回答
不將就

SELECT ... FOR UPDATE的WHERE中不帶主鍵,就是鎖全表了。不知道為啥你要FOR UPDATE。

2018年1月19日 20:06