我試圖做一個鏈接交換腳本,並遇到一些麻煩。 每個鏈接都可以通過一個IP地址x次訪問(鏈接表中的頻率)。每次看病收費(在鏈接表中給出的極限支出上限)一些信貸多個選擇的Mysql查詢導致高CPU負載
我有以下表格:
CREATE TABLE IF NOT EXISTS `contor` (
`key` varchar(25) NOT NULL,
`uniqueHandler` varchar(30) DEFAULT NULL,
`uniqueLink` varchar(30) DEFAULT NULL,
`uniqueUser` varchar(30) DEFAULT NULL,
`owner` varchar(50) NOT NULL,
`ip` varchar(15) DEFAULT NULL,
`credits` float NOT NULL,
`tstamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`key`),
KEY `uniqueLink` (`uniqueLink`),
KEY `uniqueHandler` (`uniqueHandler`),
KEY `uniqueUser` (`uniqueUser`),
KEY `owner` (`owner`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `links` (
`unique` varchar(30) NOT NULL DEFAULT '',
`url` varchar(1000) DEFAULT NULL,
`frequency` varchar(5) DEFAULT NULL,
`limit` float NOT NULL DEFAULT '0',
PRIMARY KEY (`unique`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
我有以下查詢:
$link = MYSQL_QUERY("
SELECT *
FROM `links`
WHERE (SELECT count(key) FROM contor WHERE ip = '$ip' AND contor.uniqueLink = links.unique) <= `frequency`
AND (SELECT sum(credits) as cost FROM contor WHERE contor.uniqueLink = links.unique) <= `limit`")
表格鏈接中有20行。
問題是,無論何時在表中約有200k行控制器CPU負載是巨大的。
應用由@Barmar提供的解決方案後:上 新增綜合指數(uniqueLink,IP)和滴速PRIMARY以外的所有其他指標,講解使我這個:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY l ALL NULL NULL NULL NULL 18
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 15
2 DERIVED pop_contor index NULL contor_IX1 141 NULL 206122
它是正確的,'總和(學分)'不使用'其中IP =「$ ip''? – Barmar
@Barmar。這是正確的,總和(信用)不使用WHERE ip ='$ ip' –
這是一個安全噩夢 – Strawberry