我刚刚使用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中索引的使用顺序?如果这是我需要关注的事情?
由于
答案 0 :(得分:2)
index_name表示外键ID。如果子表上已经显式定义了可以支持外键的索引,则忽略index_name值。否则,MySQL会隐式创建外键索引
表中索引的顺序不会影响查询将使用的索引。您甚至不能说通常所有查询都应首先使用此类索引,因为不同的查询可能需要不同的索引。此外,MySQL在查询中每个表不能使用多于1个索引。
通常,MySQL决定使用哪个索引(如果有的话)。如果您认为MySQL在其决策中存在错误,那么您可以使用index hint来影响MySQL的决定:
索引提示为优化器提供有关如何在查询处理期间选择索引的信息。
在较新版本的MySQL中,您还可以使用optimizer hints来影响查询计划。
影响索引使用的最后一种方法是使用analyse table command强制更新在表上收集的索引统计信息:
ANALYZE TABLE分析并存储表的密钥分发。