【问题标题】:Which column(s) to index in MySQL在 MySQL 中索引哪些列
【发布时间】:2013-04-22 17:12:41
【问题描述】:

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

【问题讨论】:

    标签: mysql select indexing between


    【解决方案1】:

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

    this MySQL doc page 视为参考。

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

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

    【讨论】:

      猜你喜欢
      • 2012-07-07
      • 2013-02-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2013-07-28
      • 2013-01-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多