性能测试:数据库

2019-08-05  本文已影响0人  LittleJessy

MySQL

MySQL架构

在这里插入图片描述
查询语句生命周期
  1. Mysql服务器监听3306端口;
  2. 验证访问用户
  3. 创建MySQL线程
  4. 检查内存(Qcache)
  5. 解析SQL
  6. 生成查询计划
  7. 打开表
  8. 检查内存(Buffer Pool)
  9. 到磁盘读取数据
  10. 写入内存
  11. 返回数据给客户端
  12. 关闭表
  13. 关闭线程
  14. 关闭连接

MySQL连接数

MySQL数据库安装完成后,默认最大连接数是100,一般流量稍微大一点的论坛或网站这个连接数是远远不够的,连接数少的话,在大并发下连接数会不够用,会有很多线程在等待其他连接释放,就可能会导致数据库连接超时或者响应时间过长,所以需要调整最大连接数。

MySQL缓存

缓存有两个纬度,MySQL层:查询缓存Query Cache(QCache);存储引擎层:InnoDB_Buffer_Pool。

MySQL慢查询

慢查询日志中记录的是执行时间较长的query,即slowquery,通过设置—log-slow-queries[=file_name]来打开该功能并设置记录位置和文件名。
慢查询日志采用简单的文本格式。其中记录了语句执行的时刻,执行消耗的时间,执行用户,连接主机等相关信息。
MySQL还提供了专门用来分析慢查询日志的工具程序mysqlslowdump,用来帮助数据库管理人员解决可能存在的性能问题。
MySQL慢查询的配置

MySQL慢查询的执行命令
set global slow_query_log=on;
set global long_query_time=1
set global slow_query_log_file=’/opt/data/slow_query.log’

查询MySQL慢查询状态:show variables like '%query%';

解析MySQL慢查询日志:mysqldumpslow命令

# mysqldumpslow -s t -t 20 -g 'select' /var/lib/mysql/xingneng205-xingneng-test-ds-slow.log
Count: 1  Time=15.00s (15s)  Lock=0.00s (0s)  Rows=1.0 (1), root[root]@[10.103.27.205]
  select sleep(N)

Died at /server/mysql/bin/mysqldumpslow line 161, <> chunk 1.

sql分析命令

sql优化

目的

  1. 减少I/O次数;
  2. 降低CPU计算

方法:改变sql的执行计划,让其尽量“少走弯路”,尽量通过各种“捷径”来找到我们需要的数据,已达到“减少IO次数”和“降低CPU计算”的目标。

优化原则


Lock的对象事务,用来锁定的是数据库中的对象,如表、行,并且一般lock的对象仅在事务commit或者rollback后释放。
特点:InnDB是通过对索引上的索引项加锁来实现行锁。意味着,只有通过索引条件检索数据,InnoDB才使用行级索,否则,InnoDB使用表级锁。
查看是否是死锁:
show engine innodb status \G;(一般日志中有dblock、lock等字样)
select * from information_schema.INNODB_TRX \G;
避免死锁方法:多线程并发下才有可能死锁;避免交叉加锁;减少涉及到的表,表联接会大大增加锁范围;避免全表更新;控制更新行数

非关系型数据库

关系型数据库通过外键关联来建立表与表之间的关系,非关系型数据库通常指数据以对象的形式存储在数据库中,而对象直接的关系通过每个对象自身的属性来决定。使用nosql的场景:数据库表schema经常变化、数据库字段是复杂的数据类型、高并发数据库请求、海量数据的分布式存储。
Nosql数据库的特点:

MongoDB
MongoDB是一款nosql类型的文档型数据库。集合=表,文档=数据。可以使用MongVUE可视化工具来连接。
MongoDB增删改查:

开启profile:MongoDB的profile和MySQL中的慢查询类似,用于记录执行时间超过多少的语句。
创建索引:db.collectios.ensureIndex({xx:1});,db.collectios. ensureIndex({xx:1,xx:1}); ensureIndex({xx:1},{“unique”:ture});
查看、删除索引:db.system.indexes.fine(); db.collections.getIndexes(); db.collections.dropIndex({xx:1}); db.user.dropIndexs();
expain:解析查询语句,db.colleciton.find({xx:xx}).explain();

Redis
连接redis,Linux下可以直接使用redis-cli进入redis命令行操作,也可以通过telnet方式连接,或可以通过redis-client可视化工具连接。
Redeis的增删改查:

Memcached
Memcached是一个高性能的分布式的内存对象缓存系统,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。Memcached没有可视化工具,只能通过Telnet方式连接。
Memcached的增删改查:

上一篇 下一篇

猜你喜欢

热点阅读