ITPub博客

首页 > 数据库 > > 13.7 数据库管理语句(2)

13.7 数据库管理语句(2)

作者:飘絮絮絮丶 时间:2020-05-12 10:16:34 0 删除 编辑

13.7.1.5 RENAME USER 语法


RENAME USER old_user TO new_user [, old_user TO new_user] ...


RENAME USER语句重命名现有的MySQL帐户。 旧帐户不存在或新帐户已存在时发生错误。


要使用RENAME USER,您必须具有全局CREATE USER权限或MySQL数据库的UPDATE权限。 当启用read_only系统变量时,RENAME USER还需要SUPER权限。


每个帐户名称使用第6.2.3节“指定帐户名称”中描述的格式。 例如:


RENAME USER 'jeffrey'@'localhost' TO 'jeff'@'127.0.0.1';


帐户名称的主机名部分(如果省略)默认为'%'。


RENAME USER会使旧用户拥有的权限成为新用户拥有的权限。 但是,RENAME USER不会自动删除和失效数据库或者旧用户创建的对象。 这包括DEFINER属性为旧用户命名的存储程序或视图。 尝试访问这些对象如果在定义者安全上下文中执行,则可能会产生错误



13.7.1.6 REVOKE 语法


REVOKE
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
FROM user [, user] ...
REVOKE ALL [PRIVILEGES], GRANT OPTION
FROM user [, user] ...


REVOKE PROXY ON user
FROM user [, user] ...


REVOKE语句使系统管理员可以撤消MySQL帐户的权限。


当启用read_only系统变量时,REVOKE除了在下面的讨论中描述的任何其他所需特权之外还需要SUPER特权。


每个帐户名称使用第6.2.3节“指定帐户名称”中描述的格式。 例如:
REVOKE INSERT ON *.* FROM 'jeffrey'@'localhost';


帐户名称的主机名部分(如果省略)默认为'%'。


有关特权级别的详细信息,允许的priv_type,priv_level和object_type值以及指定用户和密码的语法,请参见第13.7.1.4节“GRANT语法”


要使用第一个REVOKE语法,您必须具有GRANT OPTION特权,并且您必须拥有您要撤消的特权。


要撤销所有权限,请使用第二种语法,该语法会删除指定用户或用户的所有全局,数据库,表,列和例程权限:


REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...


要使用此REVOKE语法,您必须具有全局CREATE USER特权或MySQL数据库的UPDATE特权。


必须从中撤销权限的用户帐户必须存在。


REVOKE删除权限,但不会删除mysql.user表项。 要完全删除用户帐户,请使用DROP USER。


如果授予表保存包含混合大小数据库或表名称的特权行,并且lower_case_table_names系统变量设置为非零值,则不能使用REVOKE来撤销这些特权。 有必要直接操作授权表。 (当设置lower_case_table_names时,GRANT不会创建这样的行,但可能在设置变量之前创建了这样的行。)


当从mysql程序成功执行时,REVOKE以 Query OK, 0 rows affected. 要确定操作后剩余的权限,请使用SHOW GRANTS。


13.7.1.7 SET PASSWORD 语法


SET PASSWORD [FOR user] = password_option
password_option: {
'auth_string' | PASSWORD('auth_string')
}


SET PASSWORD语句将密码分配给MySQL用户帐户。 'auth_string'表示明文(未加密)密码。


注意:

  • SET PASSWORD ... = PASSWORD('auth_string')语法从MySQL 5.7.6开始已弃用,并将在未来的MySQL版本中删除。
  • SET PASSWORD ... ='auth_string'语法不被弃用,但ALTER USER是帐户更改的首选语句,包括分配密码。 例如:

    ALTER USER user IDENTIFIED BY 'auth_string';

    SET PASSWORD可以使用或不使用明确命名用户帐户的FOR子句:
  • 使用FOR用户子句,该语句将设置指定帐户的密码,该密码必须存在:

SET PASSWORD FOR 'jeffrey'@'localhost' = 'auth_string';

  • 没有FOR用户子句,该语句为当前用户设置密码:

SET PASSWORD = 'auth_string';

任何使用非匿名帐户连接到服务器的客户端都可以更改该帐户的密码。 要查看服务器认证了哪个帐户,请调用CURRENT_USER()函数:
SELECT CURRENT_USER();


为指定帐户(使用FOR子句)设置密码需要MySQL数据库的UPDATE特权。 为自己设置密码(对于不含FOR子句的非匿名帐户)不需要特殊权限。 当启用read_only系统变量时,SET PASSWORD需要SUPER权限以及其他所需的权限。


如果给出了FOR用户子句,则帐户名称使用第6.2.3节“指定帐户名称”中描述的格式。 例如:
SET PASSWORD FOR 'bob'@'%.example.org' = 'auth_string';


帐户名称的主机名部分(如果省略)默认为'%'。
密码可以通过以下方式指定:

  • 使用不带PASSWORD()的字符串

SET PASSWORD FOR 'jeffrey'@'localhost' = 'password';
SET PASSWORD将字符串解释为明文字符串,将其传递给与该帐户关联的验证插件,并将插件返回的结果存储在mysql.user帐户行中。 (这个插件有机会将这个值散列成它期望的加密格式,插件可以使用指定的值,在这种情况下不会发生哈希。)

  • 使用PASSWORD()函数(从MySQL 5.7.6开始不推荐)

    SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('password');

    PASSWORD()参数是明文(未加密)密码。 PASSWORD()哈希密码并返回加密的密码字符串以存储在mysql.user帐户行中。

    PASSWORD()函数使用由old_passwords系统变量值的值确定的散列方法来散列密码。 确保old_passwords具有与该帐户关联的身份验证插件预期的哈希方法相对应的值。 例如,如果帐户使用mysql_native_password插件,则old_passwords值必须为0:

    SET old_passwords = 0;
    SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('password');

    如果old_passwords值与身份验证插件所需的值不同,则由PASSWORD()返回的哈希密码值将不会被插件使用,并且不会发生客户端连接的正确验证。


    13.7.2 表维护语句


    13.7.2.1 ANALYZE TABLE语法

    ANALYZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [, tbl_name] ...

    ANALYZE TABLE执行密钥分发分析并存储指定表的分发。 对于MyISAM表格,这种说法相当于使用myisamchk --analyze。

    此语句需要表的SELECT和INSERT权限。


    ANALYZE TABLE可与InnoDB,NDB和MyISAM表一起使用。 它不适用于视图。
    分区表支持ANALYZE TABLE,您可以使用ALTER TABLE ... ANALYZE PARTITION分析一个或多个分区;

    在分析过程中,该表用InnoDB和MyISAM的读锁锁定。

    默认情况下,服务器将ANALYZE TABLE语句写入二进制日志,以便它们复制到复制从服务器。 要禁止日志记录,请指定可选的NO_WRITE_TO_BINLOG关键字或其别名LOCAL。


    ANALYZE 表输出
    ANALYZE TABLE返回一个结果集,列表如下表所示。





key 分布分析




如果自上次密钥分发分析以来该表未发生更改,则不会再次分析该表。


MySQL使用存储的key 分布来决定连接的表连接顺序,而不是常量。 此外,可以在决定查询中的特定表使用哪些索引时使用key 分布


特别是,如果innodb_stats_persistent系统变量已启用,则必须在将实质数据加载到InnoDB表中或为其创建新索引之后运行ANALYZE TABLE。


要检查存储的key 分布 基数,请使用SHOW INDEX语句或INFORMATION_SCHEMA.STATISTICS表。




13.7.2.2 CHECK TABLE 语法


CHECK TABLE tbl_name [, tbl_name] ... [option] ...


option = {
FOR UPGRADE
| QUICK
| FAST
| MEDIUM
| EXTENDED
| CHANGED
}


CHECK TABLE检查一个或多个表的错误。 对于MyISAM表,关键统计信息也会更新。 CHECK TABLE还可以检查视图的问题,例如视图定义中引用的表不再存在的表。


要检查一个表格,你必须有一些权限。


CHECK TABLE适用于InnoDB,MyISAM,ARCHIVE和CSV表格。


CHECK TABLE会忽略未索引的虚拟生成列。




CHECK TABLE 输出


CHECK TABLE返回一个结果集,其列表如下表所示。





该语句可能会为每个检查表产生许多行信息。 最后一行有一个Msg_type状态值,Msg_text通常应该是OK。 对于MyISAM表,如果你没有得到OK或Table is already up to date,你通常应该对表进行修复。
Table is already up to date ,这意味着表的存储引擎表明不需要检查表




13.7.2.3 CHECKSUM 表语法


CHECKSUM TABLE tbl_name [, tbl_name] ... [QUICK | EXTENDED]


CHECKSUM TABLE报告表内容的校验和。 您可以使用此语句验证在备份,回滚或其他旨在将数据恢复到已知状态的操作之前和之后内容是否相同。


该语句需要该表的SELECT特权。


此声明不支持视图。 如果对视图运行CHECKSUM TABLE,则Checksum值始终为NULL,并返回警告。


对于不存在的表,CHECKSUM TABLE返回NULL并生成警告。


在校验和操作过程中,该表使用InnoDB和MyISAM的读锁来锁定。






性能考虑


默认情况下,整个表被逐行读取并计算校验和。 对于大型表,这可能需要很长时间,因此您只会偶尔执行此操作。 这种逐行计算是您通过EXTENDED子句,InnoDB和除MyISAM以外的所有其他存储引擎获得的结果,并且MyISAM表不是使用CHECKSUM = 1子句创建的。


对于使用CHECKSUM = 1子句创建的MyISAM表,CHECKSUM TABLE或CHECKSUM TABLE ... QUICK返回可以非常快地返回的“实时”表校验和。 如果该表不符合所有这些条件,则QUICK方法返回NULL。 InnoDB表不支持QUICK方法。


校验和值取决于表格行格式。 如果行格式更改,则校验和也会更改。 例如,时间类型(如TIME,DATETIME和TIMESTAMP)的存储格式在MySQL 5.6.5之前的MySQL 5.6中已更改,因此如果5.5表升级到MySQL 5.6,则校验和值可能会更改。


重要:
如果两个表的校验和不同,那么几乎可以肯定的是这些表在某种程度上是不同的。 但是,由于CHECKSUM TABLE使用的散列函数不能保证无冲突,所以两个不相同的表可能会产生相同的校验和。






13.7.2.4 OPTIMEIZE table 语法
OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [, tbl_name] ...




OPTIMIZE TABLE重新组织表数据和关联索引数据的物理存储,以减少访问表时的存储空间并提高I/O效率。 对每个表进行的确切更改取决于该表使用的存储引擎。


在这些情况下使用OPTIMIZE TABLE,具体取决于表的类型:

  • 对具有自己的.ibd文件的InnoDB表进行大量插入,更新或删除操作后,因为它是在启用innodb_file_per_table选项的情况下创建的。 表和索引被重新组织,并且磁盘空间可以被操作系统回收使用。
  • 在对InnoDB表中的FULLTEXT索引的一部分的列进行大量的插入,更新或删除操作之后。 首先设置配置选项innodb_optimize_fulltext_only = 1。 要将索引维护期保持在合理的时间,请设置innodb_ft_num_word_optimize选项以指定要在搜索索引中更新的词数,然后运行一系列OPTIMIZE TABLE语句,直到搜索索引完全更新。
  • 删除大部分MyISAM或ARCHIVE表后,或对具有可变长度行(具有VARCHAR,VARBINARY,BLOB或TEXT列的表)的MyISAM或ARCHIVE表进行许多更改之后。 删除的行保留在链接列表中,随后的INSERT操作将重新使用旧的行位置。 您可以使用OPTIMIZE TABLE来回收未使用的空间并对数据文件进行碎片整理。 对表进行大量更改后,此语句可能还会提高使用该表的语句的性能,有时还会显着提高。





此语句需要表的SELECT和INSERT权限。


OPTIMIZE TABLE适用于InnoDB,MyISAM和ARCHIVE表。 OPTIMIZE TABLE也支持内存NDB表的动态列。 它不适用于内存表的固定宽度列,也不适用于磁盘数据表。 可以使用--ndb_optimization_delay来调整NDB群集表上OPTIMIZE的性能,该控制通过OPTIMIZE TABLE控制处理批次行之间等待的时间长度。




对于NDB簇表,可以通过(例如)中断执行OPTIMIZE操作的SQL线程来中断OPTIMIZE TABLE。


默认情况下,OPTIMIZE TABLE不适用于使用任何其他存储引擎创建的表,并返回表示缺少支持的结果。 通过使用--skip-new选项启动mysqld,可以使OPTIMIZE TABLE适用于其他存储引擎。 在这种情况下,OPTIMIZE TABLE只是映射到ALTER TABLE。




此语句不适用于视图。


OPTIMIZE TABLE支持分区表。




默认情况下,服务器将OPTIMIZE TABLE语句写入二进制日志,以便它们复制到复制从服务器。 要禁止日志记录,请指定可选的NO_WRITE_TO_BINLOG关键字或其别名LOCAL。




OPTIMEIZE TABLE 输出


OPTIMIZE TABLE返回一个结果集,其列表如下表所示。




OPTIMIZE TABLE表捕获和抛出从旧文件复制表统计信息到新创建文件时发生的任何错误。 例如。 如果.frm,.MYD或.MYI文件的所有者的用户标识与mysqld进程的用户标识不同,则OPTIMIZE TABLE将生成一个“ cannot change ownership of the file”错误,除非mysqld由root 启动 用户。




InnoDB 细节


对于InnoDB表,OPTIMIZE TABLE映射到ALTER TABLE ... FORCE,该表重建表以更新索引统计信息并释放聚簇索引中未使用的空间。 当您在InnoDB表上运行时,它会显示在OPTIMIZE TABLE的输出中,如下所示:


mysql> OPTIMIZE TABLE foo;

+----------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text |+----------+----------+----------+-------------------------------------------------------------------+

| test.foo | optimize | note | Table does not support optimize, doing recreate + analyze instead |

| test.foo | optimize | status | OK |

+----------+----------+----------+-------------------------------------------------------------------+




OPTIMIZE TABLE使用常规和分区的InnoDB表的在线DDL,这可以减少并发DML操作的停机时间。 由OPTIMIZE TABLE触发并在ALTER TABLE ... FORCE的封面下执行的表重建已完成。 在操作的准备阶段和提交阶段只会短暂地执行排他表锁。 在准备阶段,更新元数据并创建中间表。 在提交阶段,提交表元数据更改。


OPTIMIZE TABLE在下列条件下使用表复制方法重建表:

  • 当old_alter_table系统变量被启用时。
  • 当启用mysqld --skip-new选项时。



包含FULLTEXT索引的InnoDB表不支持使用联机DDL的OPTIMIZE TABLE。 而是使用表复制方法。


InnoDB使用页面分配方法存储数据,并且不会像传统存储引擎(如MyISAM)那样遭受碎片化。 在考虑是否运行优化时,请考虑服务器将要处理的事务的工作量:

  • 预计会出现一定程度的碎片化。 InnoDB只填充93%的页面,为更新留出空间而不必拆分页面。
  • 删除操作可能会留下空白,导致页面的填充量比预期的要少,这可能会使值得优化表。
  • 当有足够的空间可用时,对行的更新通常会重写同一页中的数据,具体取决于数据类型和行格式。
  • 随着时间的推移,高并发工作负载可能会在索引中留下空隙,因为InnoDB通过其MVCC机制保留了相同数据的多个版本。





MyISAM 细节


对于MyISAM表,OPTIMIZE TABLE的工作原理如下:
1.如果该表已删除或拆分行,请修复该表。
2.如果索引页面未被排序,请对它们进行排序。
3.如果表的统计信息不是最新的(并且通过对索引进行排序无法完成修复),请更新它们。






其他考虑


OPTIMIZE TABLE在线执行,用于常规和分区的InnoDB表。 否则,MySQL在OPTIMIZE TABLE运行时锁定该表。


OPTIMIZE TABLE不排序R-tree索引,例如POINT列上的空间索引。 (Bug#23578)






13.7.3.3 INSTALL PLUGIN 语法


INSTALL PLUGIN plugin_name SONAME 'shared_library_name'


这条语句安装一个服务器插件。 它需要mysql.plugin系统表的INSERT权限。


plugin_name是在库文件中包含的插件描述符结构中定义的插件的名称(请参见第28.2.4.2节“插件数据结构”)。 插件名称不区分大小写。 为了获得最大的兼容性,插件名称应限制为ASCII字母,数字和下划线,因为它们在C源文件,shell命令行,M4和Bourne shell脚本以及SQL环境中使用。




shared_library_name是包含插件代码的共享库的名称。 该名称包含文件扩展名(例如,libmyplugin.so,libmyplugin.dll或libmyplugin.dylib)。


共享库必须位于plugin目录(由plugin_dir系统变量命名的目录)中。 该库必须位于插件目录中,而不是在子目录中。 默认情况下,plugin_dir是pkglibdir配置变量所指定目录下的插件目录,但可以通过在服务器启动时设置plugin_dir的值来更改它。 例如,在my.cnf文件中设置它的值:


[mysqld] plugin_dir=/path/to/plugin/directory




如果plugin_dir的值是一个相对路径名,它将被视为相对于MySQLbase 目录(basedir系统变量的值)。


INSTALL PLUGIN加载并初始化插件代码,使插件可供使用。 通过执行初始化函数来初始化插件, 该函数在可以使用之前处理插件必须执行的任何设置。 当服务器关闭时,它会为加载的每个插件执行取消初始化功能,以便插件能够执行任何最终的清理。


INSTALL PLUGIN通过向mysql.plugin表中添加一行代表插件名称和库文件名称来注册该插件。 在服务器启动时,服务器加载并初始化mysql.plugin表中列出的任何插件。 这意味着插件与INSTALL PLUGIN一起安装仅仅一次,而不是每次服务器启动时。 如果使用--skip-grant-tables选项启动服务器,则不会在启动时加载插件。






一个插件库可以包含多个插件。 对于要安装的每一个,请使用单独的INSTALL PLUGIN语句。 每个语句都会命名一个不同的插件,但它们都指定相同的库名称。




INSTALL PLUGIN会导致服务器读取选项(my.cnf)文件,就像在服务器启动时一样。 这使得插件可以从这些文件中获取任何相关的选项。 即使在加载插件之前(如果使用宽松前缀),也可以将插件选项添加到选项文件中。 也可以卸载插件,编辑my.cnf,然后再次安装插件。 通过这种方式重新启动插件可以在不重新启动服务器的情况下启用新的选项值。


要删除插件,请使用UNINSTALL PLUGIN语句。


要查看安装了哪些插件,请使用SHOW PLUGINS语句或查询INFORMATION_SCHEMA.PLUGINS表。


如果您重新编译插件库并需要重新安装它,则可以使用以下任一方法:


  • 使用UNINSTALL PLUGIN卸载库中的所有插件,将新的插件库文件安装到插件目录中,然后使用INSTALL PLUGIN将所有插件安装到库中。 此过程的优点是可以在不停止服务器的情况下使用它。 但是,如果插件库包含许多插件,则必须发出多个INSTALL PLUGIN和UNINSTALL PLUGIN语句。



  • 停止服务器,在插件目录中安装新的插件库文件,然后重新启动服务器。





13.7.3.4 UNINSTALL PLUGIN 语法


UNINSTALL PLUGIN plugin_name


该语句删除已安装的服务器插件。 它需要mysql.plugin系统表的DELETE权限。 UNINSTALL PLUGIN是INSTALL PLUGIN 的补充。


plugin_name必须是mysql.plugin表中列出的某个插件的名称。 服务器执行插件的反初始化函数,并从mysql.plugin表中删除该插件的行,以便后续服务器重新启动时不会加载并初始化该插件。 UNINSTALL PLUGIN不会删除插件的共享库文件。


如果任何使用它的表已打开,则无法卸载插件。




删除插件会影响关联表的使用。 例如,如果全文分析器插件与表上的FULLTEXT索引关联,则卸载该插件将使表不可用。 任何访问表的尝试都会导致错误。 该表甚至无法打开,因此您不能删除使用该插件的索引。 这意味着除非你不关心格内容,否则卸载插件是值得关注的。 如果您卸载的插件无意在稍后重新安装,并且您关心表内容,则应该使用mysqldump转储表并从转储的CREATE TABLE语句中除去WITH PARSER子句,以便稍后可以重新加载表。 如果您不关心表 甚至可以在缺少相关插件的表上使用DROP TABLE。






13.7.4.1 分配变量的set 语法


SET variable_assignment [, variable_assignment] ... variable_assignment:
user_var_name = expr
| param_name = expr
| local_var_name = expr
| [GLOBAL | SESSION]
system_var_name = expr
| [@@global. | @@session. | @@]
system_var_name = expr


变量赋值的SET语法使您可以将值分配给影响一个或多个服务器操作的不同类型的变量:

  • 系统变量

系统变量也可以在服务器启动时设置,要显示系统变量名称和值,请使用SHOW VARIABLES语句。


  • 用户定义的变量
  • 存储过程和函数 参数和 存储程序本地变量





分配变量值的SET语句不会写入二进制日志,因此在复制方案中,它只影响执行它的主机。 要影响所有复制主机,请在每个主机上执行语句。


以下示例说明了设置变量的SET语法, 他们使用=赋值运算符。但是:=赋值运算符也被允许用于此目的。


用户变量被写为@var_name,并被赋值为一个表达式值,如下所示:


SET @var_name = expr;


例子:
SET @name = 43;
SET @total_tax = (SELECT SUM(tax) FROM taxable_transactions);


expr的范围可以从简单(一个文字值)到复杂(由标量子查询返回的值)。


SET适用于定义它们的存储对象上下文中的参数和局部变量。 以下过程将计数器局部变量用作循环计数器:




CREATE PROCEDURE p()
BEGIN
DECLARE counter INT DEFAULT 0;
WHILE counter < 10 DO
-- ... do work ...
SET counter = counter + 1;
END WHILE;
END;


许多系统变量都是动态的,并且可以在运行时使用SET语句进行更改。 要用SET更改系统变量,请按名称引用它,可选地在前面加上一个修饰符:


  • 要表明变量是全局变量,请在名称前面加上 GLOBAL 关键字或@@global.标识符:

SET GLOBAL max_connections = 1000;
SET @@global.max_connections = 1000;


SUPER权限是设置全局变量所必需的。


  • 要指示变量是会话变量,请在名称前面加上SESSION 关键字 或@@ 标识符:

SET SESSION sql_mode = 'TRADITIONAL';
SET @@session.sql_mode = 'TRADITIONAL';
SET @@sql_mode = 'TRADITIONAL';


设置会话变量通常不需要特殊权限,虽然有例外需要SUPER权限(例如sql_log_bin)。 客户端可以更改自己的会话变量,但不能更改其他客户端的会话变量。


  • LOCAL 和 @@local. 是SESSION 和 @@session.的同义词。
  • 如果不存在修饰符,SET会更改会话变量。
  • 在这些情况下发生错误:
    • 设置仅具有会话值的变量时使用SET GLOBAL(或@@ global。):

mysql> SET GLOBAL sql_log_bin = ON; ERROR 1231 (42000): Variable 'sql_log_bin' can't be set to the value of 'ON'

  • 设置仅具有全局值的变量时省略GLOBAL(或@@ global.):

mysql> SET max_connections = 1000; ERROR 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL

  • 设置仅具有全局值的变量时使用SET SESSION(或@@ SESSION.):

mysql> SET SESSION max_connections = 1000; ERROR 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL




前面的修饰符只适用于系统变量。 尝试将它们应用于用户定义的变量,存储过程或函数参数或存储的程序局部变量时发生错误。


SET语句可以包含多个变量赋值,用逗号分隔。 该语句将值分配给用户定义的变量和系统变量:


SET @x = 1, SESSION sql_mode = '';


如果您设置了多个系统变量,则语句中最新的GLOBAL或SESSION修饰符将用于未指定修饰符的后续赋值。


多变量赋值的例子:
SET GLOBAL sort_buffer_size = 1000000, SESSION sort_buffer_size = 1000000;
SET @@global.sort_buffer_size = 1000000, @@local.sort_buffer_size = 1000000;
SET GLOBAL max_connections = 1000, sort_buffer_size = 1000000;


如果SET语句中的任何变量赋值失败,则整个语句将失败并且不会更改任何变量。


如果更改了会话系统变量,则该值将在会话中保持有效,直到您将变量更改为不同的值或会话结束。 该更改对其他会话没有影响。


如果更改全局系统变量,则会将该值记住并用于新会话,直到将该变量更改为其他值或服务器退出。 任何访问全局变量的客户端都可以看到该更改。 但是,更改仅影响更改后连接的客户端的相应会话变量。 全局变量更改不会影响任何当前客户端会话的会话变量(甚至不会影响SET GLOBAL语句发生的会话)。




要使全局系统变量设置为永久性的,以便它适用于跨服务器重新启动,则还应将其设置为选项文件。


要将GLOBAL值设置为已编译的MySQL默认值或将SESSION变量设置为当前对应的GLOBAL值,请将该变量设置为值DEFAULT。 例如,以下两个语句在将max_join_size的会话值设置为当前全局值时是相同的:




SET @@session.max_join_size=DEFAULT;
SET @@session.max_join_size=@@global.max_join_size;




并非所有的系统变量都可以设置为DEFAULT。 在一些情况下,分配DEFAULT会出现错误。


尝试将DEFAULT分配给用户定义的变量,存储过程或函数参数或存储的程序局部变量时发生错误。


要在表达式中引用系统变量的值,请使用@@-修饰符之一。 例如,您可以像这样在SELECT语句中检索值:


SELECT @@global.sql_mode, @@session.sql_mode, @@sql_mode;


要在表达式中以@@var_name(而不是@@ global.或@@ session.)引用系统变量,MySQL会返回会话值(如果存在),否则返回全局值。 这与SET @@var_name = expr不同,后者始终引用会话值。






13.7.5 SHOW 语法






SHOW有很多形式提供有关服务器的数据库,表,列或状态信息的信息。 本节介绍以下内容:


SHOW {BINARY | MASTER} LOGS
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
SHOW CHARACTER SET [like_or_where]
SHOW COLLATION [like_or_where]
SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [like_or_where]
SHOW CREATE DATABASE db_name
SHOW CREATE EVENT event_name
SHOW CREATE FUNCTION func_name
SHOW CREATE PROCEDURE proc_name
SHOW CREATE TABLE tbl_name
SHOW CREATE TRIGGER trigger_name
SHOW CREATE VIEW view_name
SHOW DATABASES [like_or_where]
SHOW ENGINE engine_name {STATUS | MUTEX}
SHOW [STORAGE] ENGINES
SHOW ERRORS [LIMIT [offset,] row_count]
SHOW EVENTS SHOW FUNCTION CODE func_name
SHOW FUNCTION STATUS [like_or_where]
SHOW GRANTS FOR user
SHOW INDEX FROM tbl_name [FROM db_name]
SHOW MASTER STATUS
SHOW OPEN TABLES [FROM db_name] [like_or_where]
SHOW PLUGINS SHOW PROCEDURE CODE proc_name
SHOW PROCEDURE STATUS [like_or_where]
SHOW PRIVILEGES
SHOW [FULL] PROCESSLIST
SHOW PROFILE [types] [FOR QUERY n] [OFFSET n] [LIMIT n]
SHOW PROFILES
SHOW RELAYLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
SHOW SLAVE HOSTS
SHOW SLAVE STATUS [FOR CHANNEL channel]
SHOW [GLOBAL | SESSION] STATUS [like_or_where]
SHOW TABLE STATUS [FROM db_name] [like_or_where]
SHOW [FULL] TABLES [FROM db_name] [like_or_where]
SHOW TRIGGERS [FROM db_name] [like_or_where]
SHOW [GLOBAL | SESSION] VARIABLES [like_or_where]
SHOW WARNINGS [LIMIT [offset,] row_count] like_or_where: LIKE 'pattern' | WHERE expr




like_or_where: LIKE 'pattern' | WHERE expr


如果给定的SHOW语句的语法包含一个LIKE 'pattern'部分,'pattern'是一个可以包含SQL%和_通配符的字符串。 该模式对于将语句输出限制为匹配值很有用。


多数SHOW语句也接受一个WHERE子句,在指定显示哪些行时提供了更大的灵活性。


许多MySQL API(如PHP)使您可以像从SELECT中选择结果集那样处理从SHOW语句返回的结果; 另外,您可以在SQL中使用INFORMATION_SCHEMA数据库中表的查询结果,而使用SHOW语句的可能无法轻松完成这些结果




13.7.5.1 SHOW BINARY LOGS 语法


SHOW BINARY LOGS
SHOW MASTER LOGS


列出服务器上的二进制日志文件。 此语句作为第13.4.1.1节“PURGE BINARY LOGS语法”中介绍的过程的一部分使用,该语句显示如何确定可以清除哪些日志。


mysql> SHOW BINARY LOGS;
+---------------+-----------+
| Log_name | File_size |
+---------------+-----------+
| binlog.000015 | 724935 |
| binlog.000016 | 733481 |
+---------------+-----------+
SHOW MASTER LOGS相当于SHOW BINARY LOGS。


具有SUPER或REPLICATION CLIENT特权的用户可以执行此语句。




13.7.5.2 SHOW BINLOG EVENTS 语法


SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]


显示二进制日志中的事件。 如果您不指定'log_name',则会显示第一个二进制日志。


LIMIT子句与SELECT语句的语法相同。


注意:
发出不带LIMIT子句的SHOW BINLOG EVENT可能会导致耗时且耗费资源的过程,因为服务器会向客户端返回二进制日志的完整内容(其中包含修改数据的服务器执行的所有语句)。 作为SHOW BINLOG EVENTS的替代方案,使用mysqlbinlog实用程序将二进制日志保存到文本文件中供日后检查和分析




SHOW BINLOG EVENTS显示二进制日志中每个事件的以下字段:

  • log_name

列出的文件的名称。

  • Pos

事件发生的位置。

  • Event_type

描述事件类型的标识符。

  • server_id

发生事件的服务器的服务器ID。

  • End_log_pos

下一个事件开始的位置,等于Pos加上事件的大小。

  • Info

有关事件类型的更多详细信息。 这些信息的格式取决于事件类型。


注意:
一些与设置用户和系统变量有关的事件不包括在SHOW BINLOG EVENTS的输出中。 要全面了解二进制日志中的事件,请使用mysqlbinlog。
SHOW BINLOG EVENTS不适用于中继日志文件。 您可以使用SHOW RELAYLOG EVENT来实现此目的。






13.7.5.5 SHOW COLUMNS 语法


SHOW [FULL]
{COLUMNS | FIELDS}
{FROM | IN} tbl_name [{FROM | IN} db_name]
[LIKE 'pattern' | WHERE expr]


SHOW COLUMNS显示有关给定表中列的信息。 它也适用于视图。 SHOW COLUMNS仅显示您拥有权限的列的信息。




您可以使用db_name.tbl_name作为tbl_name FROM db_name语法的替代方法。 换句话说,这两个语句是等价的:


SHOW COLUMNS FROM mytable FROM mydb;
SHOW COLUMNS FROM mydb.mytable;


可选的FULL关键字会使输出包含列排序规则和注释,以及您对每列的权限。


LIKE子句(如果存在)指示要匹配哪些列名称。 可以使用WHERE子句来使用更一般的条件来选择行。




mysql> SHOW COLUMNS FROM City; +-------------+----------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+----------+------+-----+---------+----------------+ | ID | int(11) | NO | PRI | NULL | auto_increment | | Name | char(35) | NO | | | | | CountryCode | char(3) | NO | MUL | | | | District | char(20) | NO | | | | | Population | int(11) | NO | | 0 | | +-------------+----------+------+-----+---------+----------------+




数据类型可能与您期望它们基于CREATE TABLE语句不同,因为当您创建或更改表时,MySQL有时会更改数据类型。


SHOW COLUMNS显示每个表格列的以下值:


  • Field

列名称

  • Type

列数据类型

  • Collation

非二进制字符串列的排序规则,或其他列为NULL。 只有使用FULL关键字时,才会显示此值。

  • Null

列可空性。 如果NULL值可以存储在列中,则值为YES,否则为NO。


  • Key

列是否被索引:

  • 如果键为空,则该列或者不被索引,或者仅被索引为多列非唯一索引中的次列。
  • 如果Key是PRI,该列是PRIMARY KEY或是多列PRIMARY KEY中的列之一。
  • 如果key 是 UNI ,字段是UNIQUE 索引的第一个字段。(UNIQUE索引允许多个NULL值,但您可以通过检查Null字段来判断该列是否允许NUL)
  • 如果Key 是MUL,这个字段是非唯一索引的第一个字段





如果多个Key值应用于表的给定列,那么Key将按照PRI,UNI,MUL的顺序显示具有最高优先级的那个值。




如果UNIQUE索引不能包含NULL值并且表中没有PRIMARY KEY,则可以将其显示为PRI。 如果多个列形成复合UNIQUE索引,则UNIQUE索引可能会显示为MUL; 尽管列的组合是唯一的,但每列仍可以存在给定值的多次出现。




  • Default

列的默认值。 如果列的显式默认为NULL,或者列定义不包含DEFAULT子句,则该值为NULL。


  • Extra

任何有关给定列的其他信息。 在这些情况下,该值不是空的:


    • 有 AUTO_INCREMENT 属性的列为 auto_increment
    • 对有 ON UPDATE CURRENT_TIMESTAMP属性的TIMESTAMP或DATETIME字段为 on update CURRENT_TIMESTAMP
    • 对于生成字段是 IRTUAL GENERATED 或 VIRTUAL STORED
  • Privileges

您拥有专栏的权限。 只有使用FULL关键字时,才会显示此值。

  • Comment

列定义中包含的任何注释。 只有使用FULL关键字时,才会显示此值。


您还可以从INFORMATION_SCHEMA获取有关表列的信息,其中包含一个COLUMNS表。


您可以使用mysqlshow db_name tbl_name命令列出表的列。


DESCRIBE语句提供与SHOW COLUMNS类似的信息。


SHOW CREATE TABLE,SHOW TABLE STATUS和SHOW INDEX语句还提供有关表的信息。




13.7.5.12 SHOW CREATE USER 语法


SHOW CREATE USER user


该语句显示创建指定用户的CREATE USER语句。 如果用户不存在,则会发生错误。 该语句需要mysql数据库的SELECT特权,除了显示当前用户的信息。


mysql> SHOW CREATE USER 'root'@'localhost'\G *************************** 1. row ***************************
CREATE USER for root@localhost: CREATE USER 'root'@'localhost'
IDENTIFIED WITH 'mysql_native_password' AS
'*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19'
REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK


输出格式受log_builtin_as_identified_by_password系统变量设置的影响。


要显示授予帐户的权限,请使用SHOW GRANTS语句。




13.7.5.13 SHOW CREATE VIEW 语法


SHOW CREATE VIEW view_name


该语句显示创建命名视图的CREATE VIEW语句。


mysql> SHOW CREATE VIEW v\G *************************** 1. row ***************************
View: v
Create View:
CREATE ALGORITHM=UNDEFINED DEFINER=`bob`@`localhost`
SQL SECURITY DEFINER VIEW `v` AS select 1 AS `a`,2 AS `b`
character_set_client: latin1
collation_connection: latin1_swedish_ci




character_set_client是创建视图时character_set_client系统变量的会话值。 collation_connection是创建视图时collation_connection系统变量的会话值。


使用SHOW CREATE VIEW需要SHOW VIEW权限,以及有问题视图的SELECT权限。


您还可以从INFORMATION_SCHEMA获取有关视图对象的信息,其中包含VIEWS表。




MySQL允许您使用不同的sql_mode设置来告诉服务器要支持的SQL语法的类型。 例如,您可以使用ANSI SQL模式来确保MySQL在您的查询中正确解释标准SQL连接运算符(双重条(||))。 如果您然后创建连接项目的视图,你可能会担心将sql_mode设置更改为与ANSI不同的值可能会导致视图无效。 但这种情况并非如此。 无论你如何写出视图定义,MySQL总是以规范的形式存储它。 下面是一个示例,显示了服务器如何将双字节连接运算符更改为CONCAT()函数:


mysql> SET sql_mode = 'ANSI'; Query OK, 0 rows affected (0.00 sec)
mysql> CREATE VIEW test.v AS SELECT 'a' || 'b' as col1; Query OK, 0 rows affected (0.01 sec)
mysql> SHOW CREATE VIEW test.v\G *************************** 1. row ***************************
View: v
Create View: CREATE VIEW "v" AS select concat('a','b') AS "col1"
...
1 row in set (0.00 sec)


以规范形式存储视图定义的优点在于,稍后对sql_mode的值进行的更改不会影响视图的结果。 然而,额外的后果是SELECT之前的注释被服务器从定义中剥离。






13.7.5.15 SHOW ENGINE 语法


SHOW ENGINE engine_name {STATUS | MUTEX}


SHOW ENGINE显示有关存储引擎的操作信息。 它需要PROCESS权限。 声明有这些变体:


SHOW ENGINE INNODB STATUS
SHOW ENGINE INNODB MUTEX
SHOW ENGINE PERFORMANCE_SCHEMA STATUS




SHOW ENGINE INNODB STATUS显示来自标准InnoDB Monitor的关于InnoDB存储引擎状态的大量信息。


注意:
InnoDB mutexes 和rwlocks也可以使用性能模式表进行监控


SHOW ENGINE INNODB在MySQL 5.7.2中删除了MUTEX输出。 它被修改并重新在MySQL 5.7.8中引入。




在MySQL 5.7.8中,使用以下选项动态配置互斥量统计信息收集:


  • 要启用互斥量统计信息的收集,请运行:

SET GLOBAL innodb_monitor_enable='latch';


  • 要重置互斥统计信息,请运行:

SET GLOBAL innodb_monitor_reset='latch';


  • 要禁用互斥量统计信息的收集,请运行:



SET GLOBAL innodb_monitor_disable='latch';


SHOW ENGINE INNODB MUTEX的互斥量统计数据集也可以通过设置innodb_monitor_enable ='all'来启用,或者通过设置innodb_monitor_disable ='all'来禁用。


SHOW ENGINE INNODB MUTEX输出具有以下列:


  • Type

总是 InnoDB


  • Name

在MySQL 5.7.8之前,名称字段会报告执行互斥锁的源文件以及创建互斥锁的文件中的行号。 行号是特定于您的MySQL版本的。 从MySQL 5.7.8开始,仅报告互斥体名称。 文件名和行号仍然报告rwlocks。


  • status

mutex 状态


在MySQL 5.7.8之前,如果在MySQL编译时定义了WITH_DEBUG,则Status字段会显示多个值。 如果未定义WITH_DEBUG,则语句仅显示os_waits值。 在后一种情况下(没有WITH_DEBUG),输出所基于的信息不足以区分保护rwlock(允许多个读取器或单个writer)的常规互斥锁和互斥锁。 因此,对于相同的互斥锁,输出可能看起来包含多行。 Pre-MySQL 5.7.8 Status 字段值包括:


  • count表示请求了多少次互斥锁。
  • spin_waits表示自旋锁必须运行多少次。
  • spin_rounds表示自旋锁回合的数量。 (spin_rounds除以spin_waits提供平均循环数。)
  • os_waits表示操作系统等待的数量。 这发生在自旋锁不起作用时(互锁锁定过程中互斥锁未锁定,并且必须屈服于操作系统并等待)。
  • os_yields 指示尝试锁定互斥锁的线程放弃它的时间片并放到操作系统中的次数(假定允许其他线程运行将释放互斥锁以使其可以锁定)。
  • os_wait_times指示在操作系统等待中花费的时间量(以毫秒为单位)。 在MySQL 5.7中,时间被禁用,并且此值始终为0。



从MySQL 5.7.8开始,状态字段会报告旋转次数,等待和调用次数。 未报告在InnoDB之外实施的低级别操作系统互斥的统计信息。

  • spins 表示旋转次数。
  • waits 表示互斥量等待的数量。
  • calls 表示请求了多少次互斥锁。





SHOW ENGINE INNODB MUTEX跳过缓冲池块的互斥锁和rw锁,因为在具有大缓冲池的系统上,输出量可能会被压倒。 (每个16K缓冲池块中有一个互斥锁和一个rw锁,每千兆字节有65,536个块。)SHOW ENGINE INNODB MUTEX也未列出从未等待的任何互斥锁或rw锁(os_waits = 0)。 因此,SHOW ENGINE INNODB MUTEX仅显示有关导致至少一个OS级别等待的缓冲池外部的互斥锁和rw锁的信息


使用SHOW ENGINE PERFORMANCE_SCHEMA STATUS检查性能架构代码的内部操作.


此声明旨在帮助DBA了解不同性能模式选项对内存要求的影响。


名称值由两部分组成,分别命名为内部缓冲区和缓冲区属性。 解释缓冲区名称如下:

  • 未公开为表的内部缓冲区在括号内命名。 示例:(pfs_cond_class).size,(pfs_mutex_class).memory。
  • 在performance_schema数据库中作为表提供的内部缓冲区按照该表的名称命名,不带圆括号。 示例:events_waits_history.size,mutex_instances.count。



  • 作为一个整体适用于性能模式的值以performance_schema开头。 例如:performance_schema.memory。



缓冲区属性具有以下含义:


  • 大小是实现使用的内部记录的大小,例如表中行的大小。 尺寸值不能更改。
  • count是内部记录的数量,例如表中的行数。 可以使用性能架构配置选项更改计数值。
  • 对于表,tbl_name.memory是大小和计数的乘积。 对于整体性能模式,performance_schema.memory是所有使用的内存的总和(所有其他内存值的总和)。





在某些情况下,Performance Schema配置参数与SHOW ENGINE值之间存在直接关系。 例如,events_waits_history_long.count对应于performance_schema_events_waits_history_long_size。 在其他情况下,这种关系更为复杂。 例如,events_waits_history.count对应于performance_schema_events_waits_history_size(每个线程的行数)乘以performance_schema_max_thread_instances(线程数)。




13.7.5.17 show errors 语法


SHOW ERRORS [LIMIT [offset,] row_count]
SHOW COUNT(*) ERRORS




SHOW ERRORS是一种类似于SHOW WARNINGS的诊断语句,只是它仅显示错误信息,而不显示错误,警告和注释。


LIMIT子句与SELECT语句的语法相同。



SHOW COUNT(*) ERRORS语句显示错误的数量。 您也可以从error_count变量中检索这个数字:


SHOW COUNT(*) ERRORS;
SELECT @@error_count;


SHOW ERRORS和error_count仅适用于错误,而不是警告或注释。 在其他方面,它们与SHOW WARNINGS和warning_count类似。 特别是,SHOW ERRORS不能显示超过max_error_count消息的信息,并且如果错误数量超过max_error_count,则error_count可能会超过max_error_count的值。





13.7.5.18 SHOW EVENTS 语法


SHOW EVENTS [{FROM | IN} schema_name] [LIKE 'pattern' | WHERE expr]


此语句显示有关事件管理器事件的信息。 它需要用于显示事件的数据库的EVENT权限。


以最简单的形式,SHOW EVENTS列出当前方案中的所有事件:


mysql> SELECT CURRENT_USER(), SCHEMA(); +----------------+----------+
| CURRENT_USER() | SCHEMA() |
+----------------+----------+
| jon@ghidora | myschema |
+----------------+----------+
1 row in set (0.00 sec)
mysql> SHOW EVENTS\G *************************** 1. row ***************************
Db: myschema
Name: e_daily
Definer: jon@ghidora
Time zone: SYSTEM
Type: RECURRING
Execute at: NULL
Interval value: 10
Interval field: SECOND
Starts: 2006-02-09 10:41:23
Ends: NULL
Status: ENABLED
Originator: 0
character_set_client: latin1
collation_connection: latin1_swedish_ci
Database Collation: latin1_swedish_ci




要查看特定模式的事件,请使用FROM子句。 例如,要查看test 方案的事件,请使用以下语句:


SHOW EVENTS FROM test;


LIKE子句(如果存在)指示要匹配哪些事件名称。 可以使用WHERE子句来使用更一般的条件来选择行,如第24.34节“SHOW语句的扩展”所述。


SHOW EVENTS输出包含以下列:

  • Db:定义事件的模式(数据库)。
  • Name:事件的名称。
  • Time zone:事件时区,它是用于安排事件的时区,并且在事件执行时在其中生效。 缺省值是SYSTEM。
  • Definer:以'user_name'@'host_name'格式创建事件的用户的帐户。
  • Type:事件重复类型,一次(瞬态)或重复(重复)。
  • Execute At: 瞬时事件设置为执行的日期和时间。 显示为DATETIME值。

对于重复性事件,此列的值始终为NULL。

  • Interval Value: 对于定期事件,是事件执行之间等待的间隔数。

对于瞬态事件,此列的值始终为NULL。


  • Interval Field:重复事件在重复之前等待的时间间隔。


对于瞬态事件,此列的值始终为NULL。


  • Starts:重复事件的开始日期和时间。 这显示为DATETIME值,如果没有为事件定义开始日期和时间,则为NULL。


对于瞬态事件,此列的值始终为NULL。


  • Ends:

重复事件的结束日期和时间。 这显示为DATETIME值,如果没有为事件定义结束日期和时间,则默认为NULL。


对于瞬态事件,此列始终为NULL。


  • Status:事件状态。 ENABLED, DISABLED, 或 SLAVESIDE_DISABLED之一。

SLAVESIDE_DISABLED表示事件的创建发生在另一台充当复制主服务器的MySQL服务器上,并复制到当前作为从服务器的MySQL服务器上,但该事件目前未在从服务器上执行。


  • Originator:创建事件的MySQL服务器的服务器ID。 默认为0。
  • character_set_client是创建例程时character_set_client系统变量的会话值。 collation_connection是创建例程时collation_connection系统变量的会话值。 数据库排序规则是与例程关联的数据库的排序规则。


事件活动语句未显示在SHOW EVENTS的输出中。 使用SHOW CREATE EVENT或INFORMATION_SCHEMA.EVENTS表


SHOW EVENTS输出中的列与INFORMATION_SCHEMA.EVENTS表中的列类似,但不相同。



13.7.5.21 SHOW GRANTS 语法


SHOW GRANTS [FOR user]


此语句以GRANT语句的形式显示分配给MySQL用户帐户的权限,该权限必须执行以复制特权分配。



注意:

要显示MySQL帐户的非特权信息,请使用SHOW CREATE USER语句。


SHOW GRANTS需要mysql数据库的SELECT权限,除了显示当前用户的权限。


要为SHOW GRANTS指定帐户,请使用与GRANT语句相同的格式; 例如,'jeffrey'@'localhost':



mysql> SHOW GRANTS FOR 'jeffrey'@'localhost'; +------------------------------------------------------------------+ | Grants for jeffrey@localhost | +------------------------------------------------------------------+ | GRANT USAGE ON *.* TO `jeffrey`@`localhost` | | GRANT SELECT, INSERT, UPDATE ON `db1`.* TO `jeffrey`@`localhost` | +------------------------------------------------------------------+


要显示授予当前用户(您用于连接服务器的帐户)的权限,可以使用以下任何语句:


SHOW GRANTS;

SHOW GRANTS FOR CURRENT_USER;

SHOW GRANTS FOR CURRENT_USER();


如果在定义者上下文中使用SHOW GRANTS FOR CURRENT_USER(或任何等效语法),例如在使用定义者而不是调用者特权执行的存储过程中),那么显示的定义是定义者而不是调用者。


SHOW GRANTS不显示可用于指定帐户但授予其他帐户的权限。 例如,如果存在匿名帐户,则指定的帐户可能能够使用其权限,但SHOW GRANTS不会显示它们。


SHOW GRANTS输出不包含IDENTIFIED BY PASSWORD子句。 改用SHOW CREATE USER语句。



13.7.5.22 show index 语法


SHOW {INDEX | INDEXES | KEYS}

{FROM | IN} tbl_name

[{FROM | IN} db_name]

[WHERE expr]


SHOW INDEX返回表索引信息。 该格式类似于ODBC中的SQLStatistics调用。 此声明需要表中任何列的某些特权。


您可以使用db_name.tbl_name作为tbl_name FROM db_name语法的替代方法。 这两个语句是等同的:


SHOW INDEX FROM mytable FROM mydb;

SHOW INDEX FROM mydb.mytable;


WHERE子句可用于使用更一般的条件来选择行


SHOW INDEX返回以下字段:


  • Table

表的名称

  • Non_unique

如果索引不能包含重复项,则为0;如果可以,则为1。

  • Key_name

索引的名称。 如果索引是主键,则名称始终为 PRIMARY。

  • Seq_in_index

索引中的列序号,从1开始。

  • Column_name

字段名称

  • Collation

列如何在索引中排序。 这可以具有值A(升序)或NULL(不排序)。


  • Cardinality

估计索引中唯一值的数量。 要更新此数值,请运行ANALYZE TABLE或(对于MyISAM表)myisamchk -a。


基数是基于统计信息的整数,所以即使对于小表格,该值也不一定准确。 基数越高,MySQL在进行连接时使用索引的机会就越大

  • Sub_part


索引前缀。 也就是说,如果列只是部分索引,则索引字符的数量,如果整列索引,则为NULL。


注意:

前缀限制以字节度量,而CREATE TABLE,ALTER TABLE和CREATE INDEX语句中的前缀长度被解释为非二进制字符串类型(CHAR,VARCHAR,TEXT)的字符数和二进制字符串类型(BINARY, VARBINARY,BLOB)字节数。 为使用多字节字符集的非二进制字符串列指定前缀长度时,请考虑这一点。


  • Packed

指示key的打包方式。 如果不是,则为NULL。

  • Null

如果该列可能包含NULL值,则为YES;否则为''。


  • Index_type

使用的索引方法(BTREE,FULLTEXT,HASH,RTREE)。


  • Comment

有关未在自己的列中描述的索引的信息,如禁用索引时为 disabled 。

  • Index_comment

在创建索引时为索引提供的任何都带有COMMENT属性的注释。


您还可以从INFORMATION_SCHEMA获取有关表索引的信息,其中包含STATISTICS表。

您可以使用mysqlshow -k db_name tbl_name命令列出表的索引。

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3158478/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2019-09-09

  • 博文量
    2646
  • 访问量
    42263