### 8.5.6 优化 InnoDB 查询

调整查询`InnoDB`表，在每个表上创建一组适当的索引。看[第 8.3.1 节，“MySQL 如何使用索引”](mysql-indexes.html)详情。遵循这些准则`InnoDB`索引：

-   因为每个`InnoDB`表有一个[首要的关键](glossary.html#glos_primary_key)（无论您是否请求），为每个表指定一组主键列，这些列用于最重要和时间关键的查询。

-   不要在主键中指定太多或太长的列，因为这些列值在每个二级索引中都是重复的。当索引包含不必要的数据时，读取这些数据的 I/O 和缓存它的内存会降低服务器的性能和可伸缩性。

-   不要创建单独的[二级索引](glossary.html#glos_secondary_index)对于每一列，因为每个查询只能使用一个索引。很少测试的列或只有几个不同值的列上的索引可能对任何查询都没有帮助。如果您对同一张表有很多查询，测试不同的列组合，请尝试创建少量[级联索引](glossary.html#glos_concatenated_index)而不是大量的单列索引。如果索引包含结果集所需的所有列（称为[覆盖指数](glossary.html#glos_covering_index))，查询可能完全避免读取表数据。

-   如果索引列不能包含任何`空值`值，将其声明为`非空`创建表时。当优化器知道每一列是否包含`空值`价值观。

-   您可以优化单查询事务`InnoDB`表，使用技术[第 8.5.3 节，“优化 InnoDB 只读事务”](innodb-performance-ro-txn.html).
