MySQL优化篇:SHOW语法


1、简介

show命令可以提供关于数据库、表、列,或者关于服务器的状态信息。

2、语法总结

2.1 常用命令

**1)显示mysql中所有数据库的名称

show databases;

2)查看mysql用户的使用权限

show grants for user_name;

3)显示create database语句是否能够创建指定的数据库,并可以查看创建库语句的SQL信息

show create database database_name;

4)显示create table语句是否能够创建指定的数据表,并可以查看到表创建语句的SQL信息

show create table table_name;

5)显示安装以后可用的存储引擎和默认引擎

show engines;

6)显示最后一个执行的语句所产生的错误、警告和通知

show warnings;

7)只显示最后一个执行语句所产生的的错误

show errors;

8)查看所有的存储过程

show procedure status;

9)查看某个存储过程的内容

show create procedure 存储过程名称;

10)查看已经创建的视图,创建时的语句

show create view view_name

11)显示当前数据库中所有表的名称

show tables;

show tables from database_name;

12)显示表中列名称

show columns from database_name.table_name

2.2 show variables命令

  • 用于显示mysql服务器的变量
  • mysqlId服务维护两种变量
    • 全局变量影响服务器的全局操作
    • 会话变量影响具体客户端连接相关操作
  • 通过连接服务器并执行SET GLOBAL var_name语句可以更改动态全局变量。要想更改全局变量,必须具有SUPER权限,重启mysql服务后失效
  • 通过SET SESSION var_name语句来更改动态会话变量,但客户只更改自己的会话变量,而不更改其他客户的会话变量,退出终端后更改失效

1)查看全局字符集

  • show global variables like ‘character%’;

  • show variables like ‘collation_%’;

2)查看当前错误日志配置

show global variables like ‘%log_err%’;

3)查看看二进制是否开启

show variables like ‘log_bin’;

4)查看mysql的连接数

show variables like ‘%connections%’;

5)查看二进制日志的存储格式

show variables like ‘binlog_format’;

6)全局查看wait_timeout值

show global variables like ‘wait_timeout’;

7)查看mysql最大连接数

show variables like ‘%max_connections%’;

8)查看当前连接数

show full processlist;

2.3 show index 命令

使用SHOW INDEX 命令来列出表中的相关的索引信息。可以通过添加 \G 来格式化输出信息

该命令有助于诊断性能低下的查询,尤其是查询是否使用了可用的索引

语法:show index from table_name

显示的结果列的含义

1)Table

表的名称

2)Non_unique

如果索引不能包括重复词,则为0;如果可以,则为1

3)key_name

索引的名称

如果名称相同则表明是同一个索引,而不是重复

4)Seq_in_index

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

5)Column_name

索引的列的名称

6)Collation

列以什么方式存储在索引中。在mysql中,有值’A’(升序)或NULL(无分类)

7)Cardinality

索引中唯一值的数目的估计值

基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。

基数越大,当进行联合时,MySQL使用该索引的机会就越大。

某个字段的重复值越少越适合建索引,所以一般都是根据Cardinality来判断索引是否具有高选择性,如果这个值非常小,就需要重新评估这个字段是否适合建立索引

通过运行analyze table 或者myisamchk -a可以更新

8)Sub_part

前置索引,如果列只是被部分地编入索引,则为被编入索引的字符的数目,如果整列被编入索引,则为NULL

对于BLOB,TEXT,或者很长的VARCHAR类型的列,必须使用前缀索引,因为MySQL不允许索引这些列的完整长度,这会让索引变得大且慢。选择长度的诀窍在于要选择足够长的前缀以保证较高的选择性,同时又不能太长以便节约空间。下面是计算前置索引长度的一般方法:

select count(distinct left(content,3))/count(*) from emp as sel3
select count(distinct left(content,4))/count(*) from emp as sel4
select count(distinct left(content,5))/count(*) from emp as sel5 

最后算出来那个长度的基数接近完整列的选择行就OK了,完整列 select count(distinct content)/count(*) from emp

9)packed

指示关键字如何被压缩,如果没有被压缩,则为NULL

压缩一般包括压缩传输协议、压缩列解决方案和压缩表解决方案。

10)Null

如果列含有NULL,则含有YES;如果没有,则该列含有NO

建立索引的列是不允许为Null的,单列索引不存Null值,复合索引不存全为Null的值,如果列允许为Null,可能会得到“不符合预期”的结果集

11)Index_type

**索引类型,**MySQL目前主要有以下几种索引类型:BTREE,FULLTEXT,HASH,RTREE

(1)BTREE

BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从输的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。

(2)FULLTEXT

全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。

(3)HASH

由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。 HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高

(4)RTREE

RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。相对于BTREE,RTREE的优势在于范围查找

12)Comment

注释信息

2.4 show status命令

SHOW STATUS命令会显示每个服务器变量的名字和值,状态变量是只读的

该命令主要用于查看MySQL服务器状态信息

通过该命令可以了解MySQL的服务器状态信息如下:

  1. 当前MySQL启动后的运行时间
  2. 当前MySQL的客户端会话连接数
  3. 当前MySQL服务器执行的慢查询数
  4. 当前MySQL执行了多少SELECT语句
  5. 执行了多少UPDATE/DELETE/INSERT语句等统计信息
  6. 从而便于我们根据当前MySQL服务器的运行状态进行对应的调整或优化工作

语法:show [统计范围] status [like ‘状态项名称’]

  • 统计范围关键字分为global和session(或local)两种

  • []中的部分是可选的,如果show status语句中不包含统计范围关键字,则默认统计范围为session,也就是只统计当前连接的状态信息

下面列出部分常用的状态信息查看语句

1)查看mysql本次启动后的运行时间(单位:秒)

show status like ‘uptime’;

2)查看select语句的执行数

show [global] status like ‘com_select’;

3)查看insert语句的执行数

show [global] status like ‘com_sinsert’;

4)查看update语句的执行数

show [global] status like ‘com_update’;

5)查看delete语句的执行数

show [global] status like ‘com_delete’;

6)查看试图连接到mysql(不管是否连接成功)的连接数

show status like ‘connections’;

7)查看线程缓存内的线程的数量

show status like ‘threads_cached’;

8)查看当前打开的连接的数量

show status like ‘threads_connected’

9)查看创建用来处理连接的线程数。如果Threads_created较大,你可能要增加thread_cache_size值

show status like ‘threads_created’

10)查看激活的(非睡眠状态)线程数

show status like ‘threads_running’

11)查看立即获得的表的锁的次数

show status like ‘table_locks_immediate’

12)查看不能立即获得的表的锁的次数。如果该值较高,并且有性能问题,你应首先优化查询,然后拆分表或使用复制

show status like ‘table_locks_waited’

13)查看创建时间超过slow_launch_time秒的线程数

show status like ‘slow_launch_threads’

14)查看查询时间超过long_query_time秒的查询的个数

show status like ‘slow_queries’