首页 > 数据库 > MySQL > 正文

MySQL入门教程之学习笔记

2024-07-24 12:37:55
字体:
来源:转载
供稿:网友

本文章把我学习mysql时的一些学习笔记分享出来给各位学习mysql的朋友参考,希望些方法对各位有所帮助.

慢速SQL:执行时间超过给定时间范围的查询就称为慢速查询.

在MySQL中如何记录慢速SQL?

答:可以在my.cnf中设置如下信息:

  1.  [mysqld]  
  2.  ; enable the slow query log, default 10 seconds  
  3.  log-slow-queries  
  4.  ; log queries taking longer than 5 seconds  
  5.  long_query_time = 5  
  6.  ; log queries that don't use indexes even if they take less than long_query_time  
  7.  ; MySQL 4.1 and newer only  
  8.  log-queries-not-using-indexes 

这三个设置的意思是可以记录执行时间超过5 秒和没有使用索引的查询.

MySQL中日志分类:

1.error log mysql错误记录日志

2.bin log 记录修改数据时候产生的quer并用二进制的方式进行存储

3.mysql-bin.index 记录是记录所有Binary Log 的绝对路径,保证MySQL 各种线程能够顺利的根据它找到所有需要的Binary Log 文件。

4.slow query log 记录慢速SQL,是一个简单的文本格式,可以通过各种文本编辑器查看其中的内容。其中记录了语句执行的时刻,执行所消耗的时间,执行用户。

5.innodb redo log 记录Innodb 所做的所有物理变更和事务信息,保证事务安全性。

SQL架构可分为:SQL 层 与 Storage Engine层

SQL Layer 中包含了多个子模块:

1、初始化模块

顾名思议,初始化模块就是在MySQL Server 启动的时候,对整个系统做各种各样的初始化操作,比如各种buffer,cache 结构的初始化和内存空间的申请,各种系统变量的初始化设定,各种存储引擎的初始化设置,等等.

2、核心API

核心API 模块主要是为了提供一些需要非常高效的底层操作功能的优化实现,包括各种底层数据结构的实现,特殊算法的实现,字符串处理,数字处理等,小文件I/O,格式化输出,以及最重要的内存管理部分。核心API 模块的所有源代码都集中在mysys 和strings文件夹下面,有兴趣的读者可以研究研究。

3、网络交互模块

底层网络交互模块抽象出底层网络交互所使用的接口api,实现底层网络数据的接收与发送,以方便其他各个模块调用,以及对这一部分的维护。所有源码都在vio 文件夹下面。

4、Client & Server 交互协议模块

任何C/S 结构的软件系统,都肯定会有自己独有的信息交互协议,MySQL 也不例外。MySQL的Client & Server 交互协议模块部分,实现了客户端与MySQL 交互过程中的所有协议。当然这些协议都是建立在现有的OS 和网络协议之上的,如TCP/IP 以及Unix Socket。

5、用户模块

用户模块所实现的功能,主要包括用户的登录连接权限控制和用户的授权管理,他就像MySQL 的大门守卫一样,决定是否给来访者"开门".

6、访问控制模块

造访客人进门了就可以想干嘛就干嘛么?为了安全考虑,肯定不能如此随意。这时候就需要访问控制模块实时监控客人的每一个动作,给不同的客人以不同的权限。访问控制模块实现的功能就是根据用户模块中各用户的授权信息,以及数据库自身特有的各种约束,来控制用户对数据的访问。用户模块和访问控制模块两者结合起来,组成了MySQL 整个数据库系统的权限安全管理的功能。

7、连接管理、连接线程和线程管理

连接管理模块负责监听对MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。而连接线程的主要工作就是负责MySQL Server 与客户端的通信,接受客户端的命令请求,传递Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的cache 等。

8、Query 解析和转发模块

在MySQL 中我们习惯将所有Client 端发送给Server 端的命令都称为query,在MySQLServer 里面,连接线程接收到客户端的一个Query 后,会直接将该query 传递给专门负责将各种Query 进行分类然后转发给各个对应的处理模块,这个模块就是query 解析和转发模块。其主要工作就是将query 语句进行语义和语法的分析,然后按照不同的操作类型进行分类,然后做出针对性的转发。

9、Query Cache 模块

Query Cache 模块在MySQL 中是一个非常重要的模块,他的主要功能是将客户端提交给MySQL 的Select 类query 请求的返回结果集cache 到内存中,与该query 的一个hash 值做一个对应。该Query 所取数据的基表发生任何数据的变化之后,MySQL 会自动使该query 的Cache 失效。在读写比例非常高的应用系统中,Query Cache 对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。

10、Query 优化器模块

Query 优化器,顾名思义,就是优化客户端请求的query,根据客户端请求的query 语句,和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略,告诉后面的程序如何取得这个query 语句的结果。

11、表变更管理模块

表变更管理模块主要是负责完成一些DML 和DDL 的query,如:update,delte,insert,create table,alter table 等语句的处理。

12、表维护模块

表的状态检查,错误修复,以及优化和分析等工作都是表维护模块需要做的事情.

13、系统状态管理模块

系统状态管理模块负责在客户端请求系统状态的时候,将各种状态数据返回给用户,像DBA 常用的各种show status 命令,show variables 命令等,所得到的结果都是由这个模块返回的.

14、表管理器

这个模块从名字上看来很容易和上面的表变更和表维护模块相混淆,但是其功能与变更及维护模块却完全不同。大家知道,每一个MySQL 的表都有一个表的定义文件,也就是*.frm文件。表管理器的工作主要就是维护这些文件,以及一个cache,该cache 中的主要内容是各个表的结构信息。此外它还维护table 级别的锁管理。

15、日志记录模块

日志记录模块主要负责整个系统级别的逻辑层的日志的记录,包括error log,binarylog,slow query log 等。

16、复制模块

复制模块又可分为Master 模块和Slave 模块两部分, Master 模块主要负责在Replication 环境中读取Master 端的binary 日志,以及与Slave 端的I/O 线程交互等工作。Slave 模块比Master 模块所要做的事情稍多一些,在系统中主要体现在两个线程上面。一个是负责从Master 请求和接受binary 日志,并写入本地relay log 中的I/O 线程。另外一个是负责从relay log 中读取相关日志事件,然后解析成可以在Slave 端正确执行并得到和Master 端完全相同的结果的命令并再交给Slave 执行的SQL 线程。

17、存储引擎接口模块

存储引擎接口模块可以说是MySQL 数据库中最有特色的一点了,目前各种数据库产品.

MySQL性能调优之监控方法:

1. set profiling=1 开启性能监控,此命令在某些版本的mysql中无法使用

2. 然后执行SQL

3. show profiless,查看系统执行SQL的时间

4. show profile cpu, block io for query 数字ID,此ID为show profiles中的性能输出日志序号.

MySQL 各存储引擎使用了三种类型(级别)的锁定机制:行级锁定,页级锁定和表级锁定。

在MySQL 数据库中,使用表级锁定的主要是MyISAM,Memory,CSV 等一些非事务性存储引擎,而使用行级锁定的主要是Innodb 存储引擎和NDB Cluster 存储引擎,页级锁定主要是BerkeleyDB 存储引擎的锁定方式。

MyISAM读请求和写等待队列中的写锁请求的优先级规则主要为以下规则决定:

1.除了READ_HIGH_PRIORITY 的读锁定之外,Pending write-lock queue 中的WRITE 写锁定能够阻塞所有其他的读锁定;

2. READ_HIGH_PRIORITY 读锁定的请求能够阻塞所有Pending write-lock queue 中的写锁定;

3. 除了WRITE 写锁定之外,Pending write-lock queue 中的其他任何写锁定都比读锁定的优先级低。

MyISAM写锁定出现在Current write-lock queue 之后,会阻塞除了以下情况下的所有其他锁定的请求:

1. 在某些存储引擎的允许下,可以允许一个WRITE_CONCURRENT_INSERT 写锁定请求

2. 写锁定为WRITE_ALLOW_WRITE 的时候,允许除了WRITE_ONLY 之外的所有读和写锁定请求

3. 写锁定为WRITE_ALLOW_READ 的时候,允许除了READ_NO_INSERT 之外的所有读锁定请求

4. 写锁定为WRITE_DELAYED 的时候,允许除了READ_NO_INSERT 之外的所有读锁定请求

5. 写锁定为WRITE_CONCURRENT_INSERT 的时候,允许除了READ_NO_INSERT 之外的所有读锁定请求

Innodb 的行级锁定注意事项:

a) 尽可能让所有的数据检索都通过索引来完成,从而避免Innodb 因为无法通过索引键加锁而升级为表级锁定;

b) 合理设计索引,让Innodb 在索引键上面加锁的时候尽可能准确,尽可能的缩小锁定范围,避免造成不必要的锁定而影响其他Query 的执行;

c) 尽可能减少基于范围的数据检索过滤条件,避免因为间隙锁带来的负面影响而锁定了不该锁定的记录;

d) 尽量控制事务的大小,减少锁定的资源量和锁定时间长度;

e) 在业务环境允许的情况下,尽量使用较低级别的事务隔离,以减少MySQL 因为实现事务隔离级别所带来的附加成本;

如何查看MyISAM中表级锁定信息:

答:show status like '%table_locks%'

table_locks_immediate:显示的数字就是锁定的次数。

table_locks_waited:显示的数字是出现表级锁定争用而发生等待的次数

如何查看Innodb中行级锁定信息:

答:show status like '%Innodb_rows%'

Innodb 的行级锁定状态变量不仅记录了锁定等待次数,还记录了锁定总时长,每次平均时长,以及最大时长,此外还有一个非累积状态量显示了当前正在等待锁定的等待数量,对各个状态量的说明如下:

● Innodb_row_lock_current_waits:当前正在等待锁定的数量;

● Innodb_row_lock_time:从系统启动到现在锁定总时间长度;

● Innodb_row_lock_time_avg:每次等待所花平均时间;

● Innodb_row_lock_time_max:从系统启动到现在等待最常的一次所花的时间;

● Innodb_row_lock_waits:系统启动后到现在总共等待的次数;

mysqlslap是一个mysql官方提供的压力测试工具,以下是比较重要的参数:

–defaults-file,配置文件存放位置

–concurrency,并发数

–engines,引擎

–iterations,迭代的实验次数

–socket,socket文件位置

自动测试:

–auto-generate-sql,自动产生测试SQL

–auto-generate-sql-load-type,测试SQL的类型。类型有mixed,update,write,key,read。

–number-of-queries,执行的SQL总数量

–number-int-cols,表内int列的数量

–number-char-cols,表内char列的数量

例如:

  1. shell>mysqlslap –defaults-file=/u01/mysql1/mysql/my.cnf –concurrency=50,100 –iterations=1 –number-int-cols=4 –auto-generate-sql –auto-generate-sql-load-type=write –engine=myisam –number-of-queries=200 -S/tmp/mysql1.sock 
  2. Benchmark 
  3. Running for engine myisam 
  4. Average number of seconds to run all queries: 0.016 seconds 
  5. Minimum number of seconds to run all queries: 0.016 seconds 
  6. Maximum number of seconds to run all queries: 0.016 seconds 
  7. Number of clients running queries: 50 
  8. Average number of queries per client: 4 
  9. Benchmark  --Vevb.com 
  10. Running for engine myisam 
  11. Average number of seconds to run all queries: 0.265 seconds 
  12. Minimum number of seconds to run all queries: 0.265 seconds 
  13. Maximum number of seconds to run all queries: 0.265 seconds 
  14. Number of clients running queries: 100 
  15. Average number of queries per client: 2 

指定数据库的测试:

–create-schema,指定数据库名称.

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表