MySQL索引顺序

时间:2016-06-09 14:20:37

标签: mysql indexing

我刚刚使用InnoDB进入MySQL的索引。

首先,希望我是对的,因为我使用InnoDB并创建外键,它们会在查询表时自动用作索引?这是对的吗?

此外,我读到索引的顺序会影响查询的速度,即使它被使用。

那么......如果确实会影响查询,我究竟如何指定索引的顺序。

如果以下表为例。对这个表上的查询首先在org_id上使用索引FK是非常有益的,因为这将大大减少读取的行数,并且大多数数据将在应用程序中分隔的是org_id。

    CREATE TABLE IF NOT EXISTS `completed_checks` (
  `complete_check_id`   int(15) NOT NULL AUTO_INCREMENT,
  `check_type`          varchar(40) NOT NULL,
  `check_desc`          varchar(200) DEFAULT NULL,
  `assigned_user`       int(12) DEFAULT NULL,
  `assigned_area`       int(12) DEFAULT NULL,
  `org_id`              varchar(8) NOT NULL,
  `check_notes`         varchar(300) DEFAULT NULL,
  `due`                 date NOT NULL,
  `completed_by`        int(12) DEFAULT NULL,
  `completed_on`        datetime DEFAULT NULL,
  `status`              int(1) DEFAULT NULL,
  `passed`              int(1) DEFAULT '0',
  PRIMARY KEY (`complete_check_id`),
  KEY `fk_org_id_CCheck` (`org_id`),
  KEY `fk_user_id_CCheck` (`assigned_user`),
  KEY `fk_AreaID_CCheck` (`assigned_area`)   
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

当在where子句中使用org_id查询此表时,MySQL会首先在org_id上使用FK索引吗?

另外,如何指定MySQL中索引的使用顺序?如果这是我需要关注的事情?

由于

1 个答案:

答案 0 :(得分:2)

  1. 是的,这是正确的,请参阅creating foreign keys上的MySQL文档:
  2.   

    index_name表示外键ID。如果子表上已经显式定义了可以支持外键的索引,则忽略index_name值。否则,MySQL会隐式创建外键索引

    1. 表中索引的顺序不会影响查询将使用的索引。您甚至不能说通常所有查询都应首先使用此类索引,因为不同的查询可能需要不同的索引。此外,MySQL在查询中每个表不能使用多于1个索引。

    2. 通常,MySQL决定使用哪个索引(如果有的话)。如果您认为MySQL在其决策中存在错误,那么您可以使用index hint来影响MySQL的决定:

    3.   

      索引提示为优化器提供有关如何在查询处理期间选择索引的信息。

      在较新版本的MySQL中,您还可以使用optimizer hints来影响查询计划。

      影响索引使用的最后一种方法是使用analyse table command强制更新在表上收集的索引统计信息:

        

      ANALYZE TABLE分析并存储表的密钥分发。