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的服务器状态信息如下:
- 当前MySQL启动后的运行时间
- 当前MySQL的客户端会话连接数
- 当前MySQL服务器执行的慢查询数
- 当前MySQL执行了多少SELECT语句
- 执行了多少UPDATE/DELETE/INSERT语句等统计信息
- 从而便于我们根据当前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’