我正在尝试优化下表,根据phpMyAdmin,有关表扫描的几个统计数据很高且索引不存在或未被使用。 (处理程序读取下一个5.7 M)
1
$query = "
SELECT * FROM apps_discrep
WHERE discrep_station = '$station'
AND discrep_date = '$date'
ORDER BY discrep_timestart";
2
$query = "
SELECT * FROM apps_discrep
WHERE discrep_date BETWEEN '$keyword' AND '$keyword3'
AND (discrep_station like '$keyword2%') ORDER BY discrep_date";
索引discrep_station,discrep_date和discrep_timestart是否正确? 目前在自动增量ID上仅存在主要唯一索引。
- 表格结构
`index` int(11) NOT NULL AUTO_INCREMENT,
discrep_station varchar(5) NOT NULL,
discrep_timestart time NOT NULL,
discrep_timestop time NOT NULL,
discrep_date date NOT NULL,
discrep_datetime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
discrep_show varchar(31) NOT NULL,
discrep_text text NOT NULL,
discrep_by varchar(11) NOT NULL,
discrep_opr varchar(11) NOT NULL,
email_traffic varchar(3) NOT NULL,
email_techs varchar(3) NOT NULL,
email_promos varchar(3) NOT NULL,
email_spots varchar(3) NOT NULL,
eas_row varchar(11) NOT NULL,
PRIMARY KEY (`index`)
ENGINE=MyISAM DEFAULT CHARSET=utf8;
答案 0 :(得分:0)
在我看来,你可以使用相同的BTREE索引获得两个查询,因为这允许你使用最左边的元组作为单独的索引。
将this MySQL doc page视为参考。
ALTER TABLE xxx ADD KEY `key1` (`discrep_station`, `discrep_date`, `discrep_timestart`) USING BTREE;
您的第一个查询将使用索引中的所有3个字段。第二个查询将仅使用索引中的前两个字段。