• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 优化性能模式查询

    监视数据库的应用程序可能会频繁使用Performance Schema表。要最有效地为这些表编写查询,请利用它们的索引。例如,包括一个WHERE子句,该子句基于与索引列中的特定值的比较来限制检索到的行。

    大多数性能模式表都有索引。那些不是通常包含很少行或不太可能频繁查询的表。通过性能架构索引,优化程序可以访问除全表扫描之外的执行计划。这些索引还可以提高相关对象(例如sys使用这些表的架构视图)的性能。

    要参见给定的“性能模式”表是否包含索引及其索引,请使用SHOW INDEXSHOW CREATE TABLE

    mysql> SHOW INDEX FROM performance_schem . ccounts\G
    *************************** 1. row 	***************************
            Table	: accounts
       Non_unique	: 0
         Key_name	: ACCOUNT
     Seq_in_index	: 1
      Column_name	: USER
        Collation	: NULL
      Cardinality	: NULL
         Sub_part	: NULL
           Packed	: NULL
             Null	: YES
       Index_type	: HASH
          Comment	:
    Index_comment	:
          Visible	: YES
    	*************************** 2. row 	***************************
            Table	: accounts
       Non_unique	: 0
         Key_name	: ACCOUNT
     Seq_in_index	: 2
      Column_name	: HOST
        Collation	: NULL
      Cardinality	: NULL
         Sub_part	: NULL
           Packed	: NULL
             Null	: YES
       Index_type	: HASH
          Comment	:
    Index_comment	:
          Visible	: YES
    mysql> SHOW CREATE TABLE performance_schem 	.rwlock_instances\G*************************** 1. row 	***************************
           Table	: rwlock_instances
    Create Table	: CREATE TABLE `rwlock_instances` (
      `NAME` varchar(128) NOT NULL,
      `OBJECT_INSTANCE_BEGIN` bigint(20) unsigned NOT NULL,
      `WRITE_LOCKED_BY_THREAD_ID` bigint(20) unsigned DEFAULT NULL,
      `READ_LOCKED_BY_COUNT` int(10) unsigned NOT NULL,
      PRIMARY KEY (`OBJECT_INSTANCE_BEGIN`),
      KEY `NAME` (`NAME`),
      KEY `WRITE_LOCKED_BY_THREAD_ID` (`WRITE_LOCKED_BY_THREAD_ID`)
    ) ENGINE=PERFORMANCE_SCHEMA DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
    

    要参见性能模式查询的执行计划以及它是否使用任何索引,请使用EXPLAIN

    mysql> EXPLAIN SELECT * FROM performance_schem . ccounts
           WHERE (USER,HOST) = ('root','localhost')\G
    *************************** 1. row 	***************************
               id	: 1
      select_type	: SIMPLE
            table	: accounts
       partitions	: NULL
             type	: const
    possible_keys	: ACCOUNT
              key	: ACCOUNT
          key_len	: 278
              ref	: const,const
             rows	: 1
         filtered	: 100.00
            Extr 	: NULL
    

    EXPLAIN输出表明优化器使用 ccountsACCOUNT包括索引USERHOST列。

    性能模式索引是虚拟的:它们是性能模式存储引擎的构造,不使用内存或磁盘存储。性能架构将索引信息报告给优化器,以便它可以构建有效的执行计划。反过来,性能模式使用有关查找内容的优化程序信息(例如,特定的键值),以便它可以执行有效的查找而无需构建实际的索引结构。此实现有两个重要的好处:

    • 它完全避免了通常需要频繁更新的表的维护成本。
    • 它在查询执行的早期减少了检索到的数据量。对于索引列上的条件,性能模式仅有效地返回满足查询条件的表行。如果没有索引,则性能模式将返回表中的所有行,要求优化器以后再针对每行评估条件以产生最终结果。

    性能架构索引是预定义的,不能删除,添加或更改。

    性能架构索引类似于哈希索引。例如:

    • 它们仅用于使用=or <=>运算符的相等比较。
    • 它们是无序的。如果查询结果必须具有特定的行顺序特征,请包含一个ORDER BY子句。

    有关哈希索引的更多信息,请参见“ B树和哈希索引的比较”。