您是否需要显式创建索引,还是在定义主键时是隐式的? MyISAM和InnoDB的答案是否相同?
主键始终自动编入索引并且唯一 . 因此,请注意不要创建冗余索引 .
例如,如果您创建了一个表
CREATE TABLE mytable (foo INT NOT NULL PRIMARY KEY, bar INT NOT NULL, baz INT NOT NULL, UNIQUE(foo), INDEX(foo)) ENGINE=InnoDB;
因为你想索引主键并对其强制执行唯一性约束,你实际上最终会在 foo 上创建三个索引!
foo
主键始终是索引的 . 对于MyISAM和InnoDB来说,这是相同的,并且通常适用于所有支持索引的存储引擎 .
根据http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html,似乎这是隐含的
即使在2009年被问到这个问题,我也会在主键上发布对MySQL文档的实际引用 . http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html
表的主键表示您在最重要的查询中使用的列或列集 . 它具有关联的索引,以实现快速查询性能
有关MySQL 5.0参考,请参阅:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
大多数MySQL索引(PRIMARY KEY,UNIQUE,INDEX和FULLTEXT)都存储在B树中 . 例外情况是空间数据类型的索引使用R树,而MEMORY表也支持哈希索引 .
主键是MyISAM和InnoDB的隐式索引 . 您可以通过在使用主键的查询上使用EXPLAIN来验证这一点 .
您不必为主键显式创建索引...默认情况下已完成 .
我想这就是答案
mysql> create table test(id int primary key, s varchar(20)); Query OK, 0 rows affected (0.06 sec) mysql> show indexes from test \G *************************** 1. row *************************** Table: test Non_unique: 0 Key_name: PRIMARY Seq_in_index: 1 Column_name: id Collation: A Cardinality: 0 Sub_part: NULL Packed: NULL Null: Index_type: BTREE Comment: Index_comment: 1 row in set (0.00 sec)
索引最适用于where子句中经常使用的列,以及任何类型的排序,例如“order by” . 您可能正在处理更复杂的数据库,因此记住一些简单的规则是件好事 .
索引会降低插入和更新的速度,因此您要在经常更新的列上小心使用它们 .
索引加快了子句和顺序的位置 . 请记住考虑在构建表时如何使用您的数据 . 还有一些其他事情需要记住 . 如果您的表非常小,即只有少数员工,那么使用索引比将其丢弃并让它进行表扫描更糟糕 .
索引实际上只对具有大量行的表格派上用场 .
要记住的另一件事是,在我们员工数据库的情况下,如果列是可变长度,则索引(以及大多数MySQL)的执行效率要低得多 .
不要忘记加入!索引连接字段可加快速度 .
8 回答
主键始终自动编入索引并且唯一 . 因此,请注意不要创建冗余索引 .
例如,如果您创建了一个表
因为你想索引主键并对其强制执行唯一性约束,你实际上最终会在
foo
上创建三个索引!主键始终是索引的 . 对于MyISAM和InnoDB来说,这是相同的,并且通常适用于所有支持索引的存储引擎 .
根据http://dev.mysql.com/doc/refman/5.0/en/constraint-primary-key.html,似乎这是隐含的
即使在2009年被问到这个问题,我也会在主键上发布对MySQL文档的实际引用 . http://dev.mysql.com/doc/refman/5.5/en/optimizing-primary-keys.html
有关MySQL 5.0参考,请参阅:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
主键是MyISAM和InnoDB的隐式索引 . 您可以通过在使用主键的查询上使用EXPLAIN来验证这一点 .
您不必为主键显式创建索引...默认情况下已完成 .
我想这就是答案
索引最适用于where子句中经常使用的列,以及任何类型的排序,例如“order by” . 您可能正在处理更复杂的数据库,因此记住一些简单的规则是件好事 .
索引会降低插入和更新的速度,因此您要在经常更新的列上小心使用它们 .
索引加快了子句和顺序的位置 . 请记住考虑在构建表时如何使用您的数据 . 还有一些其他事情需要记住 . 如果您的表非常小,即只有少数员工,那么使用索引比将其丢弃并让它进行表扫描更糟糕 .
索引实际上只对具有大量行的表格派上用场 .
要记住的另一件事是,在我们员工数据库的情况下,如果列是可变长度,则索引(以及大多数MySQL)的执行效率要低得多 .
不要忘记加入!索引连接字段可加快速度 .