在MySQL里,我们一般使用SHOW STATUS查询服务器状态,语法一般来说如下:

MySQL(一),MySQL(

SHOW [GLOBAL | SESSION] STATUS [LIKE ‘pattern’ | WHERE expr]

1 MySQL学习路线

  • 基础阶段:MySQL数据库的基本操作(增删改查),以及一些高级操作(视图、触发器、函数、存储过程等)。
  • 优化阶段:如何提高数据库的效率,如索引,分表等。
  • 部署阶段:如何搭建真实的环境系统,如服务器集群,负载均衡等。

 

执行命令后会看到很多内容,其中有一部分是Handler_read_*,它们显示了数据库处理SELECT查询语句的状态,对于调试SQL语句有很大意义,可惜实际很多人并不理解它们的实际意义,本文简单介绍一下:

2 数据库的基础

为了让介绍更易懂,先建立一个测试用的表:

2.1 什么是数据库?

  • 数据库:database,存储数据的仓库。
  • 数据库(专业定义):高效的存储和处理数据的介质(介质主要是两种:磁盘和内存)。

 

CREATE TABLE IF NOT EXISTS `foo` (
`id` int(10) unsigned NOT NULL auto_increment,
`col1` varchar(10) NOT NULL,
`col2` text NOT NULL,
PRIMARY KEY (`id`),
KEY `col1` (`col1`)
);

2.2 数据库的分类?

  • 基于存储介质的不同
    • 关系型数据库(SQL)
    • 非关系型数据库(NoSQL)  

 

INSERT INTO `foo` (`id`, `col1`, `col2`) VALUES
(1, ‘a’, ‘a’),
(2, ‘b’, ‘b’),
(3, ‘c’, ‘c’),
(4, ‘d’, ‘d’),
(5, ‘e’, ‘e’),
(6, ‘f’, ‘f’),
(7, ‘g’, ‘g’),
(8, ‘h’, ‘h’),
(9, ‘i’, ‘i’);

2.3 不同的数据库阵营中的产品有哪些?

  • 关系型数据库:
    • 大型数据库:Oracle、DB2。
    • 中型数据库:SQL Server、MySQL等。
    • 小型数据库:access等。  
  • 非关系型数据库:
    • memached
    • mogodb
    • redis  

 

在下面的测试里,每次执行SQL时按照如下过程执行:

2.4 两种数据库阵营的区别?

  • 关系型数据库:安全(保存磁盘基本不可能丢失),容易理解,比较浪费空间。
  • 非关系型数据库:效率高,不安全(断电会丢失)。

 

FLUSH STATUS;
SELECT …;
SHOW SESSION STATUS LIKE ‘Handler_read%’;
EXPLAIN SELECT …;

3 关系型数据库

Handler_read_first

3.1 什么是关系型数据库?

  • 关系型数据库:是一种建立在关系模型(数学模型)上的数据库。
  • 关系模型:一种所谓建立在关系的模型,关系模型包括以下三个方面:
    • 数据结构:数据存储的问题,二维表(有行和列)。
    • 操作指令集合:所有SQL语句。
    • 完整性约束:表内数据约束,表与表之间约束(外键)。  

 

The number of times the first entry was read from an index. If this
value is high, it suggests that the server is doing a lot of full index
scans; for example, SELECT col1 FROM foo, assuming that col1 is indexed.

3.2 关系型数据的设计?

  • 从需要存储的数据需求中分析,如果是一类数据(实体,比如人、书本等)应该设计成一张二维表,表是由表头(字段名)和数据部分(实际存储的数据单元)组成,如下图所示。  
表头 字段1 字段2
数据单元 数据1 数据2

 

 

 

  • 以实际案例来进行处理:分析一个教学系统,讲师负责教学,教学生,在教室教学。
    • ①找出系统中的实体:讲师表,学生表,班级表。
    • ②找出实体中应该存在的数据信息:
      • 讲师:姓名,性别,年龄,身高,工资等。
      • 学生:姓名,性别,学好,学科等。
      • 班级:班级名字,教室编号等。 

 

      • 关系型数据库:维护的是实体内部,实体与实体之间的联系。
      • 实体内部的联系:每个学生都有姓名,性别,学号,学科,年龄等信息。    
姓名 性别 学号 学科 年龄
张三 001 java 23
李四 002 MySQL  
王二   003 Linux 17

 

 

 

 

      • 第二行的所有字段,都是描述张三这个学生(内部联系);第二列只能存放性别(内部约束)。    
      • 关系型数据库的特点之一:如果表中对应的某个字段没有值(数据),但是系统依然需要分配空间,所以关系型数据库比较浪费空间。    

 

      • 实体与实体之间的联系:每个学生属于某个班级,每个班级一定有多个学生(一对多)。    
      • 学生表:      
姓名 性别 学号 学科 年龄
张三 001 java 23
李四 002 MySQL  
王二   003 Linux 17

 

 

 

 

      • 班级表:    
班级名称 教室编号
java001 A001
Linux002 B005

 

 

 

 

      • 解决方案:在学生表中增加一个班级字段来指向班级(必须能够唯一的找到一个班级信息)    
姓名 性别 学号 学科 年龄 所属班级
张三 001 java 23 java001
李四 002 MySQL   MySQL005
王二   003 Linux 17 Linux002

 

 

 

 

      • 学生实体与班级实体之间的关系:实体与实体之间的关系。    

 

此选项表明SQL是在做一个全索引扫描,注意是全部,而不是部分,所以说如果存在WHERE语句,这个选项是不会变的。如果这个选项的数值很大,既是好事也是坏事。说它好是因为毕竟查询是在索引里完成的,而不是数据文件里,说它坏是因为大数据量时,简便是索引文件,做一次完整的扫描也是很费时的。

4 关键字说明

  • 数据库:database。
  • 数据库系统:database
    system(DBS):是一种虚拟系统,将多种内容关联起来的称呼。DBS=DBMS+DB。
  • DBMS:数据库管理系统,database management system,专门管理数据库。
  • DBA:数据库管理员,database administrator。
  • 行/记录:row/record,本质是一个东西,都是指表中的一行(一条记录)。行是从结构角度,记录是从数据角度出发。
  • 列/字段:column/Field,本质是一个东西。

 

FLUSH STATUS;

5 SQL

  • SQL:Structured Query
    Language,结构化查询语言(数据主要以查询为主)。
  • SQL分为三个部分:
    • DDL:Data Definition
      Language,数据定义语言。用来维护存储数据的结构(数据库,表),代表指令:create、drop、alter等。
    • DML:Data Manipulation
      Language,数据操作语言,用来对数据进行操作(数据表中的内容),代表指令:Insert、delete、update等。其中DML内部又单独进行了一个分类:DQL(Data
      Query Language:数据查询语言,如select)。
    • DCL:Data Control
      Language,数据控制语言,主要负责权限管理,代表指令:grant、revoke等。  
  • SQL是关系型数据库的操作指令,SQL是一种约束,但不强制(类似于W3C),所以不同的关系型数据库产品内部可能有一些细微的差别。

 

1 MySQL学习路线 基础阶段
:MySQL数据库的基本操作(增删改查),以及一些高级操作(视图、触发器、函数、存储过程等…

SELECT col1 FROM foo;

mysql> SHOW SESSION STATUS LIKE ‘Handler_read%’;
+———————–+——-+
| Variable_name         | Value |
+———————–+——-+
| Handler_read_first    | 1     |
| Handler_read_key      | 0     |
| Handler_read_next     | 9     |
| Handler_read_prev     | 0     |
| Handler_read_rnd      | 0     |
| Handler_read_rnd_next | 0     |
+———————–+——-+
6 rows in set (0.00 sec)

mysql> EXPLAIN SELECT col1 FROM foo\G
         type: index
        Extra: Using index

Handler_read_key

The number of requests to read a row based on a key. If this value is
high, it is a good indication that your tables are properly indexed for
your queries.

此选项数值如果很高,那么恭喜你,你的系统高效的使用了索引,一切运转良好。

FLUSH STATUS;

SELECT * FROM foo WHERE col1 = ‘e’;

mysql> SHOW SESSION STATUS LIKE ‘Handler_read%’;
+———————–+——-+
| Variable_name         | Value |
+———————–+——-+
| Handler_read_first    | 0     |
| Handler_read_key      | 1     |
| Handler_read_next     | 1     |
| Handler_read_prev     | 0     |
| Handler_read_rnd      | 0     |
| Handler_read_rnd_next | 0     |
+———————–+——-+

mysql> EXPLAIN SELECT * FROM foo WHERE col1 = ‘e’\G
         type: ref
        Extra: Using where

Handler_read_next

The number of requests to read the next row in key order. This value is
incremented if you are querying an index column with a range constraint
or if you are doing an index scan.

此选项表明在进行索引扫描时,按照索引从数据文件里取数据的次数。

FLUSH STATUS;

SELECT col1 FROM foo ORDER BY col1 ASC;

mysql> SHOW SESSION STATUS LIKE ‘Handler_read%’;
+———————–+——-+
| Variable_name         | Value |
+———————–+——-+
| Handler_read_first    | 1     |
| Handler_read_key      | 0     |
| Handler_read_next     | 9     |
| Handler_read_prev     | 0     |
| Handler_read_rnd      | 0     |
| Handler_read_rnd_next | 0     |
+———————–+——-+

mysql> EXPLAIN SELECT * FROM foo WHERE col1 = ‘e’\G
         type: index
        Extra: Using index

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图