高性能mysql看不懂_高性能mysql笔记1

转载请注明:TheViper http://www.cnblogs.com/TheViper

<>这本书写的真的很好,只可惜本屌不才,大部分都看不懂,暂且记下与mysql优化有关,对自己有用的东西。

测试指标

吞吐量

吞吐量指的是单位时间内的事务处理数,单位tps(transaction per second).这一直是经典的数据库应用测试的指标。

响应时间或延迟

这个指标用于测试任务所需的整体时间

并发性

注意,web服务器并发性不等同于数据库的并发性。服务器的高并发一般也会导致数据库的高并发,但服务器所用的语言,框架,工具集对此都会有影响。一个设计良好的应用,同时可以打开成千上百个数据库服务器连接,但可能同时只有少数连接在执行查询。因此,所需要关注的是正在工作中的并发操作,或者是同时工作中的线程数或连接数。

可扩展性

可扩展性指的是,给系统增加一倍的工作,理想情况下,会获得两倍的吞吐量,这时,看实际增加的吞吐量是多少。

性能优化的目标--响应时间

很多人认为性能优化就是降低cpu利用率。但这是个陷阱,资源就是用来消耗并用来工作的。所以,有时候消耗更多的资源能够加快查询速度。很多时候,升级到mysql新版本后,cpu利用率会上升的很厉害。这不代表性能出了问题。相反,说明新版本对资源的利用率上升了。

另外,如果把性能优化仅仅看出是提升每秒查询量,这其实只是吞吐量优化。吞吐量的提升可以减少响应时间的副产品(倒数关系)。

优化数据类型

更小的通常更好

一般情况下,应该尽量使用可以正确存储数据的最小数据类型。但是确保没有低估需要存储的值得范围。

简单就好

简单数据类型的操作通常需要更少的cpu周期。例如,整型比字符操作代价更低,具体的。

1.应该使用mysql内建类型而不是字符串存储日期和时间

2.应该用整型存储ip地址。

尽量避免null

通常情况下,最好指定列为not null,除非真的需要存储null值。如果查询中包含可为null的列,对mysql来说会更难优化,因为可为null的列使得索引,索引计算和值比较更复杂。另外,可为null的列会使用更多的存储空间。

下面具体说下数据类型

整数类型

有两种类型的数字,整数和实数。如果存储整数,可以使用这几种整数类型:TINYINT,SMALLINT,MEDIUMINT,INT,BIGINT,对应8,16,24,32,64位存储空间。

整数类型有UNSINGED属性,表示不允许负数,这大致可以是整数的最大值上限提高一倍。

mysql可以为整数类型指定宽度,如INT(7),但对大多数应用这时没意义的。它不会限制值的范围。对于存储来说,INT(1)和INT(10)是一样的。

2.实数类型

实数是带有小数部分的数字。但是,它们不仅可以用来储存小数部分,还可以使用DECIMAL储存比BIGINT还大的整数。

浮点类型在储存同样范围的值时,通常比DECIMAL使用更少的空间。FLOAT使用4个字节储存,DOUBLE使用8个字节储存。mysql使用DOUBLE作为内部浮点计算的类型。

注意,在数据量比较大时,例如储存财务数据,可以考虑使用BIGINT替代DECIMAL,将需要存储的货币单位,根据小数的位数乘以相应的倍数即可。这样可以同时避免浮点存储不精确和DECIMAL精确计算代价高的问题。

3.字符串类型

VARCHAR:用于存储可变长字符串。它比定长类型更节省空间,因为它仅使用必要的空间。

VARCHAR需要使用1或2个额外字节记录字符串的长度。如果列的最大长度<=255字节,则使用1个字节表示,否则使用2个字节。

由于行是变长的,在update时可能会使行变得比原来长。下面情况下使用VARCHAR比较合适。

1.字符串列的最大长度比平均长度大很多

2.列的更新很少,不会出现碎片问题。

3.使用了想utf-8这样复杂的字符集。

4.每个字符都使用不同的字节数进行存储。

CHAR:定长,mysql总是根据定义的字符串长度分配足够的空间。

在存储时,mysql会删除所有的末尾空格。CHAR适合存储很短的字符串,或所有值都接近同一长度。

例如,CHAR适合存储密码的md5值,因为它是定长的。对于经常变更的数据,CHAR比VARCHAR更好,因为CHAR不容易产生碎片。

4.blob和text类型

两者都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。

5.日期,时间类型

mysql能存储的最小时间粒度为秒。

DATETIME:这个类型能保存大范围的值,从1001年到9999年,精度为秒,它把日期和时间封装到格式为YYYYMMDDHHMMSS的整数中,与时区无关,使用8个字节的存储空间。

TIMESTAMP:这个类型保存了从1970年1月1日0时以来的秒数。它和unix时间戳相同。它使用4个字节储存,因此范围比DATETIME小很多,只能表示1970年到2038年。TIMESTAMP显示的值与时区有关。

创建高性能的索引

索引可以包含一个或多个列的值。如果索引包含多个列,那列的顺序十分重要,因为mysql只能高效的使用索引的最左前缀列。

最常见的B-Tree索引,按照顺序存储数据,所以mysql可以做order by和group by操作。因为数据是有序的,所以B-Tree也会将相关的列值都存储在一起。最后,因为索引中存储了实际的值,所以某些查询只使用索引,就能够完成全部查询。

策略:

1.独立的列:索引列不能是表达式的一部分,也不能是函数的参数。比如,

select id from a where id+1=5

select .... where TO_DAYS(CURRENT_DATE)-TO_DAYS(date_col)<=10

应该养成简化where条件的习惯,始终将索引列单独放在比较符号的一侧。

2.前缀索引:索引开始的部分字符。

对于像BLOB,TEXT这种很长的列,必须使用前缀索引。因为mysql不允许索引这些列的完整长度。

因此建立前缀索引的关键是,选择足够长的前缀,以保证较高的选择性,同时又不能太长。

前缀应该足够长,以使得前缀索引的选择性接近于索引整个列。为了找出这个足够长度,需要找到最常见的值的列表,然后和最常见的前缀列表进行比较。例如

e2c50b12b36e86f2aab5ff751728e9b8.png

可以看到每个值都在45到65之间,区分度不好。下面取3个前缀字符

04422e8cd9ad3c27c5e65455480a6112.png

这次区分度就要好点了,下面继续增加前缀长度,最后发现前缀长度为7时比较合适

e0658497c1a1589c843a631dcb565002.png

计算合适前缀长度的另一个方法是计算完整列的选择性,并使前缀的选择性接近于完整列的选择性,具体的

b78b33888e5097429a591466b01b47e2.png

b96201133cee2021220978318ec3c97a.png

3.多列索引

一个常见的错误是,为每个列创建一个单独的索引,或按照错误的顺序创建多列索引。

关于索引列的顺序,正确的顺序依赖于使用该索引的查询,同时还要考虑是否满足排序和分组的需要。

一个经验:将选择性最高的列放在索引的最前列。这个经验在不需要考虑排序和分组的时候效果很好。这时候索引的作用只是在优化where条件的查找。

事实上,性能不只是依赖于所有索引列的选择性,也和查询条件的具体值有关,也就是和值分布有关,这和前面说的选择最佳前缀长度需要考虑的地方一样。换句话说,可能需要根据那些运行频率最高的查询来调整索引列的顺序。

使用索引扫描排序

mysql有两种方式生成有序结果,通过排序操作或按索引顺序扫描。如果explain出来的type列的值为index,说明使用了索引扫描做排序。

扫描索引本身是很快的,因为只需要从一条索引记录移动到紧接的下一条记录。但如果索引不能覆盖查询所需的全部列,那就不得不每扫描一条索引记录就回表查询一次对应的行。这基本上都是随机的io.因此按索引顺序读取数据的速度通常比顺序的全表扫描慢,尤其是在io密集型的工作负载中。

mysql可以使用同一个索引既满足排序,又用于查找行。因此,如果可能,设计索引时应该尽可能的满足这两种任务最好。

只有当索引的顺序和order by子句的顺序完全一致,并且所有列的排列方向都一样时,mysql才能使用索引对结果排序。

如果查询需要关联多张表,则只有当order by子句引用的字段全部为第一个表时,才能使用索引做排序。

order by子句和查找性查询的限制是一样的,需要满足索引的最左前缀的要求,否则,mysql都需要执行排序操作。

有一种情况可以不满足索引的最左前缀要求,依然可以使用索引排序。那就是当前导量为常数时。例如

在一个表上,建立索引(a,b,c)。

select ... where a=“2014-12-21” order by b,c.

这时索引的第一列被指定为常数,可以使用索引。下面的也可以使用索引

select ... where a>"2014-12-21" order by b

select ... where a>"2014-12-21" order by a,b

这两个刚好用了索引的前缀,所以也可以。

下面是一些不能使用索引进行排序的查询

select ... where a="2014-12-21" order by b DESC,c ESC

查询使用了两种不同的排序方向,但是索引列都是正序排序的。

select ... where a="2014-12-21" order by b,d

引用了一个不在索引中的列

select ... where a="2014-12-21" order by c

where和order by中的列无法组成索引的最左前缀,因为跳过了b这个列

select ... where a>"2014-12-21" order by b,c

第一列是范围查询

select ... where a>"2014-12-21" and b in(1,2) order by c

b列上有多个等于条件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526857.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 热词分析_Python笔记:热词分析2020-01-01

热词分析在公众趋势分析、舆情分析有很宽广的应用&#xff0c;我们来看看怎么从一个TXT文件中分析出文章的热词出来&#xff0c;我们采用流行的第三方“结巴”包来实现。首先安装第三方包(matplotlib&#xff0c;jieba&#xff0c;wordcloud&#xff0c;numpy)mmatplotlib主要来…

子进程会继承父进程的哪些内容_【学习教程】Node.js创建子进程方法

来源 | https://github.com/CommanderXL/biu-blog/issues/25exec其中exec可用于在指定的shell当中执行命令。不同参数间使用空格隔开&#xff0c;可用于复杂的命令。const { exec } require(child_process)exec(cat *.js bad_file | wc -l)exec方法用于异步创建一个新的子进程…

mysql筛选两个表有相同项的数据库_用SQL查询两个表中相同的数据

展开全部 1、创建测试表; create table test_col_1(id number, var varchar2(200)); create table test_col_2(id number, var varchar2(200)); 2、插入测试数据, insert into test_col_1 select level*8, var||32313133353236313431303231363533e59b9ee7ad9431333431373839l…

MySQL建表添加乐观锁字段_Java秒杀系统优化-Redis缓存-分布式session-RabbitMQ异步下单-页面静态化...

Java秒杀系统优化-Redis缓存-分布式session-RabbitMQ异步下单-页面静态化项目介绍基于SpringBootMybatis搭建的秒杀系统&#xff0c;并且针对高并发场景进行了优化&#xff0c;保证线程安全的同时极大地提高了服务器的吞吐量&#xff0c;主要优化手段有页面静态化、Redis缓存(页…

叶金荣mysql教程_mysql优化--叶金荣老师讲座笔记

copy to tmp table执行ALTER TABLE修改表结构时建议&#xff1a;凌晨执行Copying to tmp table拷贝数据到内存中的临时表&#xff0c;常见于GROUP BY操作时建议&#xff1a;创建索引Copying to tmp table on disk临时结果集太大&#xff0c;内存中放不下&#xff0c;需要将内存…

python qqbot实现qq聊天机器人_Python QQBot库的QQ聊天机器人

本文实例为大家分享了Python QQBot库的QQ聊天机器人的具体代码&#xff0c;供大家参考&#xff0c;具体内容如下1.安装pip install qqbot2.主动发出消息from qqbot import _bot as bot# 登录QQbot.Login([-q, 2816626661])buddy 获取指定名称/备注的好友group 获取群buddy bot…

tp5 mysql实现消息队列_TP5系列 | Queue消息队列

消费信息如下ThinkPHP5 Queue消息队列优点1、Queue内置了 Redis&#xff0c;Database&#xff0c;Topthink &#xff0c;Sync这四种驱动&#xff0c;本文使用Redis驱动2、Queue消息队列适用于大并发或者返回结果 时间有点长并需要批量操作的第三方接口&#xff0c;可用于短信发…

java创建临时文件夹_java创建临时文件

[java]代码库/*** 创建临时文件** param prefix* 临时文件名的前缀* param suffix* 临时文件名的后缀* param dirName* 临时文件所在的目录&#xff0c;如果输入null&#xff0c;则在用户的文档目录下创建临时文件* return 临时文件创建成功返回true&#xff0c;否则返回false*…

linux cmake编译安装mysql_Linux源码安装MySQL 5.6.12 (Cmake编译)

Linux源码安装MySQL 5.6.12 (Cmake编译)1.安装make编译器(默认系统自带)下载地址&#xff1a;tar zxvf make-3.82.tar.gzcd make-3.82./configuremakemake install2.安装bison下载地址&#xff1a;tar zxvf bison-2.5.tar.gzcd bison-2.5./configuremakemake install3.安装gcc-…

JAVA怎么实现网页退出系统_java后台实现js关闭本页面,父页面指定跳转或刷新操作...

关闭本页面&#xff0c;跳转到百度response.setCharacterEncoding("gbk");PrintWriter outresponse.getWriter();out.print("");out.print("");关闭本页面&#xff0c;刷新父页面response.setCharacterEncoding("gbk");PrintWriter ou…

java 布尔逻辑运算符_Java运算符

Java语言提供许多操作符。操作符是特殊的符号(symbol)&#xff0c;它对一个或者两个、三个的操作数进行运算&#xff0c;然后返回一个结果&#xff0c;最简单的就像我们一年级学到的 -号。一般地&#xff0c;可以将运算符分为四大类&#xff1a;算数运算符、位运算符、关系运算…

Java自动化获取页面主题_基于Selenium2+Java的UI自动化(4) - WebDriver API简单介绍

1. 启动浏览器前边有详细介绍启动三种浏览器的方式(IE、Chrome、Firefox)&#xff1b;private WebDriver driver null;private String chromeDriverDir "D:\\workspace\\A_Test\\resource\\chromedriver.exe";/*** 打开谷歌浏览器&#xff1b;*/public void openCh…

js java 反射机制_java 类加载机制和反射机制

一.类的加载机制jvm把class文件加载到内存&#xff0c;并对数据进行校验、解析和初始化&#xff0c;最终形成jvm可以直接使用的java类型的过程。(1)加载将class文件字节码内容加载到内存中&#xff0c;并将这些静态数据转换成方法区中的运行时数据结构&#xff0c;在堆中生成一…

lambda 流 peek java_JDK8 流与λ表达式

λ表达式什么是λ表达式λ表达式有三部分组成&#xff1a;参数列表&#xff0c;箭头(->)&#xff0c;以及一个表达式或者语句块。public int add(int x, int y) {return x y;}转换为λ表达式(int x, int y) -> x y;去除参数类型(x, y) -> x y;无参 以及 只有一个参…

理解java虚拟机工作后了解吗_JAVA入门到再次入门——深入理解JAVA虚拟机(二)|七日打卡...

前言为什么叫做入门到到再次入门请参考前一篇或个人博客&#xff0c;在此不再赘述&#xff0c;嗯哼&#xff0c;了解了JVM的基本运行流程以及内存结构&#xff0c;算是初步认识了JVM&#xff0c;跟着课本往前走&#xff0c;继续了解根据JVM的内存模型探索java当中变量的可见性以…

java访问错误404_如何解决 Java web 项目中的 404 错误

在使用 Tomcat 进行 Java Web 开发的时候&#xff0c;经常会遇到以下 HTTP 404 错误&#xff1a;错误代码为 HTTP 404(未找到)&#xff0c;描述信息是&#xff1a;“The origin server did not find a current representation for the target resource or is not willing to di…

java double 的精度_Java Double的精度问题

Java.text类 DecimalFormatjava.lang.Objectjava.text.Formatjava.text.NumberFormatjava.text.DecimalFormatvoid setMaximumFractionDigits(int newValue) 设置某个数的小数部分中所允许的最大数字位数。void setMinimumFractionDigits(int newValue) …

java餐饮管理系统图片,基于jsp的酒店餐饮管理系统-JavaEE实现酒店餐饮管理系统 - java项目源码...

基于jspservletpojomysql实现一个javaee/javaweb的酒店餐饮管理系统, 该项目可用各类java课程设计大作业中, 酒店餐饮管理系统的系统架构分为前后台两部分, 最终实现在线上进行酒店餐饮管理系统各项功能,实现了诸如用户管理, 登录注册, 权限管理等功能, 并实现对各类酒店餐饮管…

php 验证码一直不对,ThinkPHP验证码老是出错怎么办

ThinkPHP验证码老是出错的解决办法&#xff1a;1、找到服务器php配置文件php.ini在网站根目录下建一个info.php文件。例如&#xff1a;D:\wwwRoot\wp 这个是网站的根目录&#xff0c;在此目录下&#xff0c;新建一个txt文档&#xff0c;输入如下代码&#xff1a;然后另存为info…

如何在php中插入数据并修改,php怎么同时向2张表里插入数据

情况是这个样子的&#xff1a;我要做一个发消息的表&#xff0c;因为接受人可能是多个&#xff0c;所以又给接收人一单独的表&#xff0c;(这种方案好还是全部都放到一张表里好点呢&#xff1f;)2张表的字段如下&#xff1a;message_id是第一张表的主键&#xff0c;如果收件人有…