在MySQL中索引哪些列

时间:2013-04-22 17:12:41

标签: mysql select indexing between

我正在尝试优化下表,根据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;

1 个答案:

答案 0 :(得分:0)

在我看来,你可以使用相同的BTREE索引获得两个查询,因为这允许你使用最左边的元组作为单独的索引。

this MySQL doc page视为参考。

ALTER TABLE xxx ADD KEY `key1` (`discrep_station`, `discrep_date`, `discrep_timestart`) USING BTREE;

您的第一个查询将使用索引中的所有3个字段。第二个查询将仅使用索引中的前两个字段。