mysql常用命令及基础知识--命令、慢查询、原理、问题(一)

本文详细介绍了MySQL的登录、查看数据库、创建用户和授权操作,以及如何查看和管理连接状态和最大连接数。此外,还深入讨论了MySQL的字符集设置,包括查看、修改和创建时的字符集选择。内容涵盖数据库编码、表编码和字段编码的查看与调整,以及Explain的使用来分析SQL查询性能。最后,提到了慢查询日志及其分析,以及解决查询乱码问题的方法。
摘要由CSDN通过智能技术生成

命令

登录MySQL

mysql -h127.0.0.1 -uroot -p

-u 表示选择登陆的用户名
-h 表示要连接的主机
-p 表示登陆的用户密码

查看数据库

show databases;

创建用户

CREATE USER username@host IDENTIFIED BY password;

username:你将创建的用户名
host:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登 陆,可以使用通配符%
password:该用户的登陆密码,密码可以为空,如果为空则该用户可以不需要密码登陆服务器

CREATE USER 'admin'@'%' IDENTIFIED BY 'admin';

授权

GRANT privileges ON databasename.tablename TO 'username'@'host' WITH GRANT OPTION;

privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所的权限则使用ALL
databasename:数据库名
tablename:表名,如果要授予该用户对所有数据库和表的相应操作权限则可用表示,如.*

GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'milo'@'%';
GRANT ALL PRIVILEGES ON *.* TO 'milo'@'%' ;
FLUSH PRIVILEGES;

查看当前连接

show status like 'Threads%';
mysql> show status like 'Threads%';
+-------------------+-------+
| Variable_name     | Value |
+-------------------+-------+
| Threads_cached    | 0     |
| Threads_connected | 4     |		###这个数值指的是打开的连接数
| Threads_created   | 4     |
| Threads_running   | 1     |		###这个数值指的是激活的连接数,这个数值一般远低于 connected 数值
+-------------------+-------+

查询数据库当前设置的最大连接数

show variables like '%max_connections%';
mysql> show variables like '%max_connections%';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 151   |
+-----------------+-------+
1 row in set (0.00 sec)

显示连接列表

show processlist;
mysql> show processlist;
+-----+----------+-----------+--------+---------+------+----------+------------------+
| Id  | User     | Host      | db     | Command | Time | State    | Info             |
+-----+----------+-----------+--------+---------+------+----------+------------------+
| 161 | clarence | localhost | mytest | Query   |    0 | starting | show processlist |
+-----+----------+-----------+--------+---------+------+----------+------------------+

显示连接状态

SHOW STATUS LIKE '%connect%';
mysql> show status like '%connect%';
+-----------------------------------------------+---------------------+
| Variable_name                                 | Value               |
+-----------------------------------------------+---------------------+
| Aborted_connects                              | 147                 |
| Connection_errors_accept                      | 0                   |
| Connection_errors_internal                    | 0                   |
| Connection_errors_max_connections             | 0                   |
| Connection_errors_peer_address                | 0                   |
| Connection_errors_select                      | 0                   |
| Connection_errors_tcpwrap                     | 0                   |
| Connections                                   | 164                 |
| Locked_connects                               | 0                   |
| Max_used_connections                          | 4                   |
| Max_used_connections_time                     | 2021-07-26 14:40:38 |
| Performance_schema_session_connect_attrs_lost | 0                   |
| Ssl_client_connects                           | 0                   |
| Ssl_connect_renegotiates                      | 0                   |
| Ssl_finished_connects                         | 0                   |
| Threads_connected                             | 1                   |
+-----------------------------------------------+---------------------+
16 rows in set (0.00 sec)

选择 mysql 数据库

use +库名称

use mysql

查看当前选中数据库中所有表

show tables;

MySQL外部连接

MySQL安装后,默认只允许本机访问

  1. 通过命令查看,看用户名对应的host是否为%;假如是,则说明可以远端访问,否则不能,需要进行第二步操作
mysql> use mysql
Database changed
mysql> select user, host from user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| clarence      | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
4 rows in set (0.00 sec)
  1. update 修改其中某一条记录的 host 字段值为’%’,或者新增一条记录且 host 字段值为’%’。
mysql> update user set host='%' where user='root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select user, host from user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| clarence      | %         |
| root          | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
+---------------+-----------+
4 rows in set (0.00 sec)

  1. 如果上面两种情况都不存在或不能解决,可以使用 netstat 命令查看 mysql 服务绑定的 ip, 如果绑定的是 127.0.0.1,则外部机器也不能访问 mysql。可以通过修改 Mysql 配置文件解决。
  • ubuntu系统,使用apt-get方式安装的mysql, 默认配置文件通常在/etc/mysql/mysql.conf.d/mysqld.cnf
  • 其他的可以通过命令“find / -name mysqld.conf”进行查找
  • 注释掉以下一行即可: bind-address = 127.0.0.1
  1. 防火墙原因(如果是云服务器需要查看)
  2. Mysql 重启

MySQL字符集

查看字符集

显示 MYSQL 字符集编码
mysql> show variables like 'charact%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
查看 MySQL 数据库服务器和数据库字符集
mysql> show variables like '%char%';
+--------------------------------------+----------------------------+
| Variable_name                        | Value                      |
+--------------------------------------+----------------------------+
| character_set_client                 | utf8                       |
| character_set_connection             | utf8                       |
| character_set_database               | utf8                       |
| character_set_filesystem             | binary                     |
| character_set_results                | utf8                       |
| character_set_server                 | utf8                       |
| character_set_system                 | utf8                       |
| character_sets_dir                   | /usr/share/mysql/charsets/ |
| validate_password_special_char_count | 1                          |
+--------------------------------------+----------------------------+
9 rows in set (0.00 sec)

查看当前安装的 MySQL 所支持的字符集
mysql> show charset;
+----------+---------------------------------+---------------------+--------+
| Charset  | Description                     | Default collation   | Maxlen |
+----------+---------------------------------+---------------------+--------+
| big5     | Big5 Traditional Chinese        | big5_chinese_ci     |      2 |
| dec8     | DEC West European               | dec8_swedish_ci     |      1 |
| cp850    | DOS West European               | cp850_general_ci    |      1 |
| hp8      | HP West European                | hp8_english_ci      |      1 |
| koi8r    | KOI8-R Relcom Russian           | koi8r_general_ci    |      1 |
| latin1   | cp1252 West European            | latin1_swedish_ci   |      1 |
| latin2   | ISO 8859-2 Central European     | latin2_general_ci   |      1 |
| swe7     | 7bit Swedish                    | swe7_swedish_ci     |      1 |
| ascii    | US ASCII                        | ascii_general_ci    |      1 |
| ujis     | EUC-JP Japanese                 | ujis_japanese_ci    |      3 |
| sjis     | Shift-JIS Japanese              | sjis_japanese_ci    |      2 |
| hebrew   | ISO 8859-8 Hebrew               | hebrew_general_ci   |      1 |
| tis620   | TIS620 Thai                     | tis620_thai_ci      |      1 |
| euckr    | EUC-KR Korean                   | euckr_korean_ci     |      2 |
| koi8u    | KOI8-U Ukrainian                | koi8u_general_ci    |      1 |
| gb2312   | GB2312 Simplified Chinese       | gb2312_chinese_ci   |      2 |
| greek    | ISO 8859-7 Greek                | greek_general_ci    |      1 |
| cp1250   | Windows Central European        | cp1250_general_ci   |      1 |
| gbk      | GBK Simplified Chinese          | gbk_chinese_ci      |      2 |
| latin5   | ISO 8859-9 Turkish              | latin5_turkish_ci   |      1 |
| armscii8 | ARMSCII-8 Armenian              | armscii8_general_ci |      1 |
| utf8     | UTF-8 Unicode                   | utf8_general_ci     |      3 |
| ucs2     | UCS-2 Unicode                   | ucs2_general_ci     |      2 |
| cp866    | DOS Russian                     | cp866_general_ci    |      1 |
| keybcs2  | DOS Kamenicky Czech-Slovak      | keybcs2_general_ci  |      1 |
| macce    | Mac Central European            | macce_general_ci    |      1 |
| macroman | Mac West European               | macroman_general_ci |      1 |
| cp852    | DOS Central European            | cp852_general_ci    |      1 |
| latin7   | ISO 8859-13 Baltic              | latin7_general_ci   |      1 |
| utf8mb4  | UTF-8 Unicode                   | utf8mb4_general_ci  |      4 |
| cp1251   | Windows Cyrillic                | cp1251_general_ci   |      1 |
| utf16    | UTF-16 Unicode                  | utf16_general_ci    |      4 |
| utf16le  | UTF-16LE Unicode                | utf16le_general_ci  |      4 |
| cp1256   | Windows Arabic                  | cp1256_general_ci   |      1 |
| cp1257   | Windows Baltic                  | cp1257_general_ci   |      1 |
| utf32    | UTF-32 Unicode                  | utf32_general_ci    |      4 |
| binary   | Binary pseudo charset           | binary              |      1 |
| geostd8  | GEOSTD8 Georgian                | geostd8_general_ci  |      1 |
| cp932    | SJIS for Windows Japanese       | cp932_japanese_ci   |      2 |
| eucjpms  | UJIS for Windows Japanese       | eucjpms_japanese_ci |      3 |
| gb18030  | China National Standard GB18030 | gb18030_chinese_ci  |      4 |
+----------+---------------------------------+---------------------+--------+
41 rows in set (0.00 sec)
查看数据库编码

SHOW CREATE DATABASE db_name;

mysql> show create database video_server;
+--------------+-----------------------------------------------------------------------+
| Database     | Create Database                                                       |
+--------------+-----------------------------------------------------------------------+
| video_server | CREATE DATABASE `video_server` /*!40100 DEFAULT CHARACTER SET utf8 */ |
+--------------+-----------------------------------------------------------------------+
1 row in set (0.00 sec)
查看表编码

SHOW CREATE TABLE tbl_name;

查看表编码

SHOW FULL COLUMNS FROM tbl_name;

mysql> show full columns from video_info;
+---------------+-------------+--------------------+------+-----+-------------------+-------+---------------------------------+---------+
| Field         | Type        | Collation          | Null | Key | Default           | Extra | Privileges                      | Comment |
+---------------+-------------+--------------------+------+-----+-------------------+-------+---------------------------------+---------+
| id            | varchar(64) | utf8mb4_general_ci | NO   | PRI | NULL              |       | select,insert,update,references |         |
| author_id     | int(10)     | NULL               | YES  |     | NULL              |       | select,insert,update,references |         |
| name          | text        | utf8mb4_general_ci | YES  |     | NULL              |       | select,insert,update,references |         |
| display_ctime | text        | utf8mb4_general_ci | YES  |     | NULL              |       | select,insert,update,references |         |
| create_time   | datetime    | NULL               | YES  |     | CURRENT_TIMESTAMP |       | select,insert,update,references |         |
+---------------+-------------+--------------------+------+-----+-------------------+-------+---------------------------------+---------+
5 rows in set (0.00 sec)
查看系统的编码字符
mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
| collation_connection     | utf8_general_ci            |
| collation_database       | utf8_general_ci            |
| collation_server         | utf8_general_ci            |
+--------------------------+----------------------------+

系统变量:

  • character_set_server: 默认的内部操作字符集
  • character_set_client: 客户端来源数据使用的字符集
  • character_set_connection: 连接层字符集
  • character_set_results: 查询结果字符集
  • character_set_database: 当前选中数据库的默认字符集
  • character_set_system: 系统元数据(字段名等)字符集
  • collation_connection 链接校对
  • collation_database 数据库校对
  • collation_server 服务器校对

设置MySQL默认字符集

在mysqld.cnf或者my.cnf中添加如下内容,保存,重启mysql即可

[client] 
default-character-set=utf8 
[mysqld] 
default-character-set=utf8

MySQL 创建设置字符集和修改字符集

创建数据库指定数据库的字符集

CREATE DATABASE IF NOT EXISTS mydb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_c i

创建表时指定字符集

CREATE TABLE table_name (id int unsigned) DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

创建字段时指定字符集

CREATE TABLE table_name2 (id int,name char(10) CHARACTER SET utf8 COLLATE utf8_general_ci);

修改数据库字符集

ALTER DATABASE db_name DEFAULT CHARACTER SET character_name [COLLATE ...];

把表默认的字符集和所有字符列(CHAR,VARCHAR,TEXT)改为新的字符集

ALTER TABLE tbl_name CONVERT TO CHARACTER SET character_name [COLLATE ...]

eg:

ALTER TABLE logtest CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

只是修改表的默认字符集

ALTER TABLE tbl_name DEFAULT CHARACTER SET character_name [COLLATE...];

eg:

ALTER TABLE logtest DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

修改字段的字符集

ALTER TABLE tbl_name CHANGE c_name c_name CHARACTER SET character_name [COLLATE ...];

eg:

ALTER TABLE logtest CHANGE title title VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_ general_ci;

Explain

作用

使用 Explain 关键字可以模拟优化器执行 SQL 查询语句,从而知道 MySQL 是如何处理你的 SQL 语句的,分析你的查询语句或是表结构的性能瓶颈。

mysql> select * from sys_user;
+---------+----------+--------------------------------------------------------------+-----------+-------------+---------+------+--------+------+----------+---------+---------+--------+--------+-----------+-----------+-------------------------+-------------------------+------------+
| user_id | username | password                                                     | nick_name | phone       | role_id | salt | avatar | sex  | email    | dept_id | post_id | remark | status | create_by | update_by | created_at              | updated_at              | deleted_at |
+---------+----------+--------------------------------------------------------------+-----------+-------------+---------+------+--------+------+----------+---------+---------+--------+--------+-----------+-----------+-------------------------+-------------------------+------------+
|       1 | admin    | $2a$10$/Glr4g9Svr6O0kvjsRJCXu3f0W8/dsP3XZyVNi1019ratWpSPMyw. | zhangwj   | 13818888888 |       1 |      |        | 1    | 1@qq.com |       1 |       1 |        | 2      |         1 |         1 | 2021-05-13 19:56:37.914 | 2021-05-13 19:56:40.205 | NULL       |
+---------+----------+--------------------------------------------------------------+-----------+-------------+---------+------+--------+------+----------+---------+---------+--------+--------+-----------+-----------+-------------------------+-------------------------+------------+
1 row in set (0.00 sec)

mysql> explain select * from sys_user;
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | sys_user | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL  |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)
  • 概要描述

    • id: 选择标识符
    • select_type: 表示查询的类型。
    • table: 输出结果集的表
    • partitions: 匹配的分区
    • type: 表示表的连接类型
    • possible_keys: 表示查询时,可能使用的索引
    • key: 表示实际使用的索引
    • key_len: 索引字段的长度
    • ref: 列与索引的比较
    • rows: 扫描出的行数(估算的行数)
    • filtered: 按表条件过滤的行百分比
    • Extra: 执行情况的描述和说明
  • id
    SELECT 识别符。这是 SELECT 的查询序列号
    1).id 相同时,执行顺序由上至下
    2).如果是子查询,id 的序号会递增,id 值越大优先级越高,越先被执行
    3).id 如果相同,从上往下顺序执行;在所有组中,id 值越大,优先级越高,越先执行

  • select_type
    (1) SIMPLE(简单 SELECT,不使用 UNION 或子查询等)
    (2) PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的 select 被标记为 PRIMARY)
    (3) UNION(UNION 中的第二个或后面的 SELECT 语句)
    (4) DEPENDENT UNION(UNION 中的第二个或后面的 SELECT 语句,取决于外面的查询)
    (5) UNION RESULT(UNION 的结果,union 语句中第二个 select 开始后面所有 select)
    (6) SUBQUERY(子查询中的第一个 SELECT,结果不依赖于外部查询)
    (7) DEPENDENT SUBQUERY(子查询中的第一个 SELECT,依赖于外部查询)
    (8) DERIVED(派生表的 SELECT, FROM 子句的子查询)
    (9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)

  • table
    显示这一步所访问数据库中表名称(显示这一行的数据是关于哪张表的,有时不是真实的表名字,可能是简称,例如e,d,也可能是第几步执行的结果的简称

  • type

    • 对表访问方式,表示 MySQL 在表中找到所需行的方式,又称“访问类型”。
    • 常用的类型有: ALL、index、range、ref、eq_ref、const、system、NULL (从左到右,性能从差到好)
      • ALL:Full Table Scan, MySQL 将遍历全表以找到匹配的行
      • index: Full Index Scan,index 与 ALL 区别为 index 类型只遍历索引树
      • range:只检索给定范围的行,使用一个索引来选择行
      • ref: 表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
      • eq_ref: 类似 ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用 primary key 或者 unique key 作为关联条件
      • const、system: 当 MySQL 对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于 where 列表中,MySQL 就能将该查询转换为一个常量,system 是 const 类型的特例,当查询的表只有一行的情况下,使用 system
      • NULL: MySQL 在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。
  • possible_keys

    • 指出 MySQL 能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null)
    • 该列完全独立于 EXPLAIN 输出所示的表的次序。这意味着在 possible_keys 中的某些键实际上不能按生成的表次序使用。
    • 如果该列是 NULL,则没有相关的索引。在这种情况下,可以通过检查 WHERE 子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样,创造一个适当的索引并且再 次用 EXPLAIN 检查查询
  • Key

    • key 列显示 MySQL 实际决定使用的键(索引),必然包含在 possible_keys 中
    • 如果没有选择索引,键是 NULL。要想强制 MySQL 使用或忽视 possible_keys 列中的索引, 在查询中使用 FORCE INDEX、USE INDEX 或者 IGNORE INDEX。
  • key_len

    • 表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len 显示的值为索引字段的最大可能长度,并非实际使用长度,即 key_len 是根据表定义计算而得,不是通过表内检索出的) 不损失精确性的情况下,长度越短越好
  • ref

    • 列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
  • rows

    • 估算出结果集行数,表示 MySQL 根据表统计信息及索引选用情况,估算的找到所需的记录所 需要读取的行数
  • Extra

    • 该列包含 MySQL 解决查询的详细信息,有以下几种情况:
      • Using where:不用读取表中所有信息,仅通过索引就可以获取所需数据,这发生在对表的全部的请求列都是同一个索引的部分的时候,表示 mysql 服务器将在存储引擎检索行后再进行过滤

      • Using temporary:表示 MySQL 需要使用临时表来存储结果集,常见于排序和分组查询, 常见 group by ; order by

      • Using filesort:当 Query 中包含 order by 操作,而且无法利用索引完成的排序操作 称为“文件排序”

        mysql> explain select * from sys_user order by username;
        +----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+----------------+
        | id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra          |
        +----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+----------------+
        |  1 | SIMPLE      | sys_user | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | Using filesort |
        +----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+----------------+
        1 row in set, 1 warning (0.00 sec)
        
      • Using join buffer:改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区 来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引 来改进能。

      • Impossible where:这个值强调了 where 语句会导致没有符合条件的行(通过收集统计 信息不可能存在结果)。

      • Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合 函数结果中返回一行

      • No tables used:Query 语句中使用 from dual 或不含任何 from 子句

总结

  • EXPLAIN 不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况
  • EXPLAIN 不考虑各种 Cache
  • EXPLAIN 不能显示 MySQL 在执行查询时所作的优化工作
  • 部分统计信息是估算的,并非精确值
  • EXPALIN 只能解释 SELECT 操作,其他操作要重写为 SELECT 后查看执行计划。

慢查询简介

Mysql 提供的一种日志记录,运行时间超过 long_querry_time 值的 SQL, 会被记录到慢查询 日志中。
在 mysql 配置文件 mysqld.cnf 中

[mysqld] 
#指定日志文件存放位置,可以为空,系统会给一个缺省的文件 host_name-slow.log 
log-slow-queries=/var/lib/mysql/slowquery.log 
#记录超过的时间,默认为 10s 
long_query_time=2 
#log 下来没有使用索引的 query,可以根据情况决定是否开启 
log-queries-not-using-indexes 
#如果设置了,所有没有使用索引的查询也将被记录 
log-long-format
#设置为 0 后,之后所有的查询操作被会被记录在慢查询日志; 
set long_query_time=0;

具体操作代码

#查看慢查询的时间阈值,默认显示为 10S
SHOW VARIABLES LIKE 'long_query_time%';
#查看是否开启
SHOW VARIABLES LIKE '%slow_query_log%';
#设置为 1,开启慢查询日志
set global slow_query_log=1;
#设置慢查询的时间为 0.001,超过 0.001 就显示为慢查询
set global long_query_time=0.001;
#睡眠 1s
select sleep(1);
#查询慢查询的条数,需要优化的条数
show global status like '%Slow_queries';

mysqldumpslow日志分析工具

-s 表示按照何种方式排序
    c 访问次数
    l 锁定时间
    r 返回记录
    t 查询时间
    al 平均锁定时间
    ar 平均返回记录数
    at  平均查询时间
-t 返回前面多少条数据
-g 后边搭配一个正则匹配模式,大小写不敏感
得到返回记录集最多的10条SQL:
mysqldumpslow -s r -t  10 /var/lib/mysql/695f5026f0f6-slow.log
得到访问次数最多的10条SQL:
mysqldumpslow -s r -t  10 /var/lib/mysql/695f5026f0f6-slow.log
得到按照时间排序的前10条里面含有左连接的SQL:
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/695f5026f0f6-slow.log
也支持管道符命令
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/695f5026f0f6-slow.log | more //分页显示

原理

MySQL字符集转换过程

1. MySQL Server 收到请求时将请求数据从 character_set_client 转换为 character_set_connection; 
2. 进行内部操作前将请求数据从 character_set_connection 转换为内部操作字符集, 
	其确定方法如下: 
	1)使用每个数据字段的 CHARACTER SET 设定值; 
	2)若上述值不存在,则使用对应数据表的 DEFAULT CHARACTER SET 设定值(MySQL 扩展, 非 SQL 标准); 
	3)若上述值不存在,则使用对应数据库的 DEFAULTCHARACTER SET 设定值; 
	4)若上述值不存在,则使用 character_set_server 设定值。 
3. 将操作结果从内部操作字符集转换为 character_set_results。

Mysql 存储需求

数值类型存储需求

列类型存储需求
TINYINT1 个字节
SMALLINT2 个字节
MEDIUMINT3 个字节
INT, INTEGER4个字节
BIGINT8个字节
FLOAT§如果 0 <= p <= 24 为 4 个字节, 如果 25 <= p <= 53 为 8 个字节
FLOAT4个字节
DOUBLE [PRECISION], item REAL4个字节
DECIMAL(M,D), NUMERIC(M,D)变长(0-4 个字节)
BIT(M)大约(M+7)/8 个字节

日期和时间类型的存储需求

列类型存储需求
DATE3个字节
DATETIME8 个字节
TIMESTAMP4 个字节
TIME3个字节
YEAR1个字节

字符串类型的存储需求

列类型存储需求
CHAR(M)M 个字节,0 <= M <= 255
VARCHAR(M)L+1 个字节,其中 L <= M 且 0 <= M <= 65535
BINARY(M)M 个字节,0 <= M <= 255
VARBINARY(M)L+1 个字节,其中 L <= M 且 0 <= M <= 255
TINYBLOB, TINYTEXTL+1 个字节,其中 L < 28
BLOB, TEXTL+2 个字节,其中 L < 216
MEDIUMBLOB, MEDIUMTEXTL+3 个字节,其中 L < 224
LONGBLOB, LONGTEXTL+4 个字节,其中 L < 232
ENUM(‘value1’,’value2’,…)1 或 2 个字节,取决于枚举值的个数(最多 65,535 个值)
SET(‘value1’,’value2’,…)1、2、3、4 或者 8 个字节,取决于 set 成员的数目(最 多 64 个成员)

上表的 M 只是为了说明占用空间大小,在实际创建表中 char(20)、varchar(20),20 指的是字 符而不是字节(4.0 版本以上,以下指的是字节);那么字符和字节的转换要看字符集,utf-8 下,1 字符=3 字节;gbk 下,1 字符=2 字节。

MySql SQL执行过程

连接器,查询缓存,分析器,优化器,执行器,存储引擎
查询缓存在mysql8.0已经去掉了

问题

乱码解决方案

1) 首先要明确你的客户端时候何种编码格式,这是最重要的(IE6 一般用 utf8,命令行一般是 gbk,一般程序是 gb2312)
2) 确保你的数据库使用 utf8 格式,所有编码通吃。
3) 一定要保证 connection 字符集大于等于 client 字符集,不然就会信息丢失,比如: latin1 < gb2312 < gbk < utf8,若设置 set character_set_client = gb2312,那么 至少 connection 的字符集要大于等于 gb2312,否则就会丢失信息 
4) 以上三步做正确的话,那么所有中文都被正确地转换成 utf8 格式存储进了数据库,为 了适应不同的浏览器,不同的客户端,你可以修改 character_set_results 来以不同的编 码显示中文字体,由于 utf8 是大方向,因此 web 应用是我还是倾向于使用 utf8 格式显示 中文的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值