0

我正在尝试优化下表,根据 phpMyAdmin,有关表扫描的几个统计数据很高,并且索引不存在或未被使用。(处理程序读取 rnd next 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;
4

1 回答 1

0

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

将此 MySQL 文档页面视为参考。

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

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

于 2013-04-22T18:00:27.343 回答