当前位置: 首页 > 编程日记 > 正文

mysql属性配置提高查询_MYSQL性能优化-安装时优化参数配置提高服务性能

MYSQL性能优化一直是个头痛的问题,目前大多都是直接把页面html静态页面或直接使用了缓存技术,下面我就mysql本身的性能优化来分享一下。

安装时优化参数配置提高服务性能

在Linux下安装Mysql采用默认配置安装的Mysql却未必是工作在最佳性能状态的,需要对其进行优化。一般认为在

Mysql的配置文件中,下列系统参数是比较关键的:

(1) interactive_timeout :

服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用

CLIENT_INTERACTIVE 选项的客户。 默认数值是28800,我把它改为7200。

(2) back_log :

要求 MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这个参数就会起作用

,然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。

back_log 值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一

个短时间内有很多连接,你需要增加它,换句话说,这值对到来的TCP/IP连接的侦听队列的大小。每个操作系统在这

个队列大小上都有它自己的限制。 试图设定back_log高于操作系统的限制将是无效的。

在mysql中back_log的设置取决于操作系统

在linux下这个参数的值不能大于系统参数tcp_max_syn_backlog的值

通过以下命令可以查看tcp_max_syn_backlog的当前值

cat /proc/sys/net/ipv4/tcp_max_syn_backlog

通过以下命令进行修改sysctl -w net.ipv4.tcp_max_syn_backlog=n

深入探讨一点

tcp/ip网络一般会有如下过程

从生成socket到bind端口在listen进而建立连接

具体到listen,就是listen(int fd, int backlog)的调用,这里backlog和mysql中back_log具有一定的关系,

即操作系统backlog的要不小于mysql中back_log的值,在linux内核2.6.6中backlog在/include/net/tcp.h中由

TCP_SYNQ_HSIZE变量定义

观察一下主机进程列表,如果发现大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect

| NULL | login | NULL 的待连接进程时,就有必要加大 back_log 的值了。默认数值是50,我把它改为500。

(3) max_connections :

允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加,否则,你将经常

看到 Too many connections 错误。 默认数值是100,我把它改为1024 。

(4) key_buffer_size :

索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小,增加它可得到更好处理的

索引(对所有读和多重写),到你能负担得起那样多。如果你使它太大,系统将开始换页并且真的变慢了。默认数值是

8388600(8M),我的MySQL主机有2GB内存,所以我把它改为 402649088(400MB)。

是否要增加这个参数的值主要看以下两点:

1、Key_reads/Key_read_requests:比例应该接近于0.01甚至越小越好

2、Key_writes/Key_write_requests:比例接近1较好

解决的办法当然是增加key_buffer_size的值啦,来实在的到控制台下面运行:

程序代码

SET GLOBAL key_buffer_size=16777216;

这是设置全局的,如果只是当前会话的话,将GLOBAL换成SESSION即可。

(5) record_buffer :

每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想

要增加该值。默认数值是131072(128K),我把它改为16773120 (16M)

(6) sort_buffer :

每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。默认数值是

2097144(2M),我把它改为 16777208 (16M)。

(7) table_cache :

为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。MySQL对每个唯一打开的表需要2个

文件描述符。默认数值是64,我把它改为512。

(8) thread_cache_size :

可以复用的保存在中的线程的数量。如果有,新的线程从缓存中取得,当断开连接的时候如果有空间,客户的线

置在缓存中。如果有很多新的线程,为了提高性能可 以这个变量值。通过比较 Connections 和 Threads_created 状

态的变量,可以看到这个变量的作用。我把它设置为 80。

(9) wait_timeout :

服务器在关闭它之前在一个连接上等待行动的秒数。 默认数值是28800,我把它改为7200。

通过设置tmp_table_size选项来增加一张临时表的大小,例如做高级GROUP BY操作生成的临时表。如果调高该值,

MySQL同时将增加heap表的大小,可达到提高联接查询速度的效果,建议尽量优化查询,要确保查询过程中生成的临时

表在内存中,避免临时表过大导致生成基于硬盘的MyISAM表。

mysql> show global status like ‘created_tmp%‘;

+——————————–+———+

| Variable_name   | Value |

+———————————-+———+

| Created_tmp_disk_tables | 21197 |

| Created_tmp_files   | 58  |

| Created_tmp_tables  | 1771587 |

+——————————–+———–+

每次创建临时表,Created_tmp_tables增加,如果临时表大小超过tmp_table_size,则是在磁盘上创建临时表,

Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服务创建的临时文件文件数,比较理想的配置是:

Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%比如上面的服务器Created_tmp_disk_tables /

Created_tmp_tables * 100% =1.20%,应该相当好了

默认为16M,可调到64-256最佳,线程独占,太大可能内存不够I/O堵塞

注:参数的调整可以通过修改 /etc/my.cnf 文件并重启 MySQL 实现。很明显的,根据服务器的硬件配置的不同,和

mysql数据库负载的不同,参数的设置也是不同的。所以大家不要照搬上面的参数,而是要根据不同的硬件和负载修改

为最适合自己的参数。

慢查询分析、优化索引和配置

索引及查询优化

索引的类型

Ø 普通索引:这是最基本的索引类型,没唯一性之类的限制。

Ø 唯一性索引:和普通索引基本相同,但所有的索引列值保持唯一性。

Ø 主键:主键是一种唯一索引,但必须指定为”PRIMARY KEY”。

Ø 全文索引:MYSQL从3.23.23开始支持全文索引和全文检索。在MYSQL中,全文索引的索引类型为FULLTEXT。全文索引

可以在VARCHAR或者TEXT类型的列上创建。

大多数MySQL索引(PRIMARY KEY、UNIQUE、INDEX和FULLTEXT)使用B树中存储。空间列类型的索引使用R-树,MEMORY表

支持hash索引。

单列索引和多列索引(复合索引)

索引可以是单列索引,也可以是多列索引。对相关的列使用索引是提高SELECT操作性能的最佳途径之一。

多列索引:

MySQL可以为多个列创建索引。一个索引可以包括15个列。对于某些列类型,可以索引列的左前缀,列的顺序非常重要

多列索引可以视为包含通过连接索引列的值而创建的值的排序的数组。一般来说,即使是限制最严格的单列索引,它

的限制能力也远远低于多列索引。

最左前缀

多列索引有一个特点,即最左前缀(Leftmost Prefixing)。假如有一个多列索引为key(firstname lastname age),

当搜索条件是以下各种列的组合和顺序时,MySQL将使用该多列索引:

firstname,lastname,age

firstname,lastname

firstname

也就是说,相当于还建立了key(firstname lastname)和key(firstname)。

索引主要用于下面的操作:

Ø 快速找出匹配一个WHERE子句的行。

Ø 删除行。当执行联接时,从其它表检索行。

Ø 对具体有索引的列key_col找出MAX()或MIN()值。由预处理器进行优化,检查是否对索引中在key_col之前发生所有

关键字元素使用了WHERE key_part_# = constant。在这种情况下,MySQL为每个MIN()或MAX()表达式执行一次关键字

查找,并用常数替换它。如果所有表达式替换为常量,查询立即返回。例如:

SELECT MIN(key2), MAX (key2) FROM tb WHERE key1=10;

Ø 如果对一个可用关键字的最左面的前缀进行了排序或分组(例如,ORDER BY key_part_1,key_part_2),排序或分组

一个表。如果所有关键字元素后面有DESC,关键字以倒序被读取。

Ø 在一些情况中,可以对一个查询进行优化以便不用查询数据行即可以检索值。如果查询只使用来自某个表的数字型

并且构成某些关键字的最左面前缀的列,为了更快,可以从索引树检索出值。

SELECT key_part3 FROM tb WHERE key_part1=1

有时MySQL不使用索引,即使有可用的索引。一种情形是当优化器估计到使用索引将需要MySQL访问表中的大部分行时

。(在这种情况下,表扫描可能会更快些)。然而,如果此类查询使用LIMIT只搜索部分行,MySQL则使用索引,因为它

可以更快地找到几行并在结果中返回。例如:

合理的建立索引的建议:

(1) 越小的数据类型通常更好:越小的数据类型通常在磁盘、内存和CPU缓存中都需要更少的空间,处理起来更快。

(2) 简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂。在MySQL中,应该用内置

的日期和时间数据类型,而不是用字符串来存储时间;以及用整型数据类型存储IP地址。

(3) 尽量避免NULL:应该指定列为NOT NULL,除非你想存储NULL。在MySQL中,含有空值的列很难进行查询优化,因

为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值

这部分是关于索引和写SQL语句时应当注意的一些琐碎建议和注意点。

1. 当结果集只有一行数据时使用LIMIT 1

2. 避免SELECT *,始终指定你需要的列

从表中读取越多的数据,查询会变得更慢。他增加了磁盘需要操作的时间,还是在数据库服务器与WEB服务器是独立分

开的情况下。你将会经历非常漫长的网络延迟,仅仅是因为数据不必要的在服务器之间传输。

3. 使用连接(JOIN)来代替子查询(Sub-Queries)

连接(JOIN).. 之所以更有效率一些,是因为MySQL不需要在内存中创建临时表来完成这个逻辑上的需要两个

步骤的查询工作。

4. 使用ENUM、CHAR 而不是VARCHAR,使用合理的字段属性长度

5. 尽可能的使用NOT NULL

6. 固定长度的表会更快

7. 拆分大的DELETE 或INSERT 语句

8. 查询的列越小越快

Where条件

在查询中,WHERE条件也是一个比较重要的因素,尽量少并且是合理的where条件是很重要的,尽量在多个条件的时候

,把会提取尽量少数据量的条件放在前面,减少后一个where条件的查询时间。

有些where条件会导致索引无效:

Ø where子句的查询条件里有!=,MySQL将无法使用索引。

Ø where子句使用了Mysql函数的时候,索引将无效,比如:select * from tb where left(name, 4) = ‘xxx’

Ø 使用LIKE进行搜索匹配的时候,这样索引是有效的:select * from tbl1 where name like ‘xxx%’,而like

‘%xxx%’ 时索引无效

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

相关文章:

c++引用的自我见解

2019独角兽企业重金招聘Python工程师标准>>> 刚开始学习c 学完指针后&#xff0c;其细节比较好明白&#xff0c;但学到引用了以后&#xff0c;只知其表却不知其底层的实现机制&#xff0c;虽然知道引用是别名、声明必须同时初始化等等&#xff0c;但这只是概念性的东…

c# yield关键字原理

https://www.cnblogs.com/blueberryzzz/p/8678700.html c# yield关键字原理详解 1.yield实现的功能yield return&#xff1a;先看下面的代码&#xff0c;通过yield return实现了类似用foreach遍历数组的功能&#xff0c;说明yield return也是用来实现迭代器的功能的。 using st…

linux进程间通信:命名管道FIFO

文章目录FIF&#xff2f; 通信特点系统调用接口应用拥有亲缘关系之间的进程通信非亲缘关系进程之间的通信总结FIF&#xff2f; 通信特点 FIFO文件有文件名 可以像普通文件一样存储在文件系统之中可以像普通文件一样使用open/write读写和pipe文件一样属于流式文件&#xff0c;不…

mysql 账户管理_如何用MySQL 命令来实现账户管理

今天我们要学习的是如何用MySQL 命令的方式来对账号进行管理&#xff0c;我们大家都知道在实际应用中MySQL 命令可以完成多种任务&#xff0c;以下的文章主要是对用MySQL 命令的方式来对账号进行管理的具体内容介绍。手册上说 “GRANT语句允许系统管理员创建MySQL用户账户&…

Can't connect to MySQL server on '127.0.0.1' (10061) (code 2003)解决方法

先验证一下MySQL的服务是否开启&#xff0c;到计算机->管理->服务和应用程序->服务 如果服务已开启&#xff0c;就检查一下C:\WINDOWS\system32\drivers\etc目录下的hosts文件&#xff0c; 是否存在这一下&#xff0c;不存在添加。 最后在mysql的配置文件my.ini中[mys…

学习MongoDB (1) :配置安装

为什么80%的码农都做不了架构师&#xff1f;>>> MongoDB是一种强大、灵活、可扩展的数据存储方式。它扩展了关系型数据库的众多有用的功能&#xff0c;如辅助索引、范围查询、排序。 最近开始在Windows 32位平台下研究MongoDB的使用&#xff0c;为了方便&#xff…

跨域策略文件crossdomain.xml文件

使用crossdomain.xml让Flash可以跨域传输数据 一、crossdomain.xml文件的作用 跨域&#xff0c;顾名思义就是需要的资源不在自己的域服务器上&#xff0c;需要访问其他域服务器。跨域策略文件是一个xml文档文件&#xff0c;主要是为web客户端(如Adobe Flash Player等)设置跨…

linux进程间通信:FIFO应用 /var/log/ 系统日志的模拟实现

在类unix操作系统下存在这样一个目录/var/log/&#xff0c;主要是记录操作系统相关的系统各个进程服务的日志信息 该日志系统的特性如下&#xff1a; 支持多进程并发写入同一文件不同进程日志信息可以写入不同文件支持使用head/tail/grep/cat/vi 等命令进行日志操作 我们可以…

context.xml mysql_在tomcat下context.xml中配置各种数据库连接池(示例代码)

Tomcat6的服务器配置文件放在 ${tomcat6}/conf 目录底下。我们可以在这里找到 server.xml 和 context.xml。当然&#xff0c;还有其他一些资源文件。但是在在本文中我们只用得上这两个&#xff0c;其他的就不介绍了。1,首先&#xff0c;需要为数据源配置一个JNDI资源。我们的数…

Planetary.js:帮助你构建超炫的互动球体效果

Planetary.js 是一个 JavaScript 库&#xff0c;用于构建互动球体效果。它使用 D3 和 TopoJSON 解析和渲染地理数据。Planetary.js 采用了基于插件的架构&#xff0c;即使是默认的功能是作为插件实现的&#xff0c;这使得 Planetary.js 非常灵活。Planetary.js 是完全可定制&am…

JAVA条件表达式的陷阱

Map<String, Integer> map new HashMap<String, Integer>(); map.put("count", null); Integer it map null ? 0 : map.get("count"); 注意&#xff1a;在第三行&#xff0c;会抛出java.lang.NullPointerException信息。因为分析&…

腾讯Bugly异常崩溃SDK接入

首先登入Bugly&#xff0c;创建应用&#xff0c;记录下AppId ①下载SDK&#xff0c;通过Cocoapods集成 pod Bugly #腾讯异常崩溃日志服务 ②导入头文件&#xff0c;并初始化 /** 腾讯Bugly */#import <…

linux进程间通信:FIFO实现进程间的双向通信

fifo的双向通信的方式如下图&#xff1a; 两个进程间的通信需要两个命名管道&#xff0c;分别处理一个进程的读和写 导致这种通信方式出现的根因还是由于fifo的阻塞读和阻塞写&#xff0c;所以这里需要使用两个管道对读写进行分别处理。 同时因为管道传输的数据为流式数据&…

load python txt文件_详解Python中numpy.loadtxt()读取txt文件

为了方便使用和记忆&#xff0c;有时候我们会把 numpy.loadtxt() 缩写成np.loadtxt() ,本篇文章主要讲解用它来读取txt文件。读取txt文件我们通常使用 numpy 中的 loadtxt()函数numpy.loadtxt(fname, dtype, comments#, delimiterNone, convertersNone, skiprows0, usecolsNone…

线程之线程标识

就像每个进程有一个进程ID一样&#xff0c;每个线程也有一个线程ID。进程ID在整个系统中是唯一的&#xff0c;但线程ID不同&#xff0c;线程ID只在它所属的进程环境中有效。 进程ID&#xff0c;用pid_t数据类型来表示&#xff0c;是一个非负整数。线程ID则用pthread_t数据类型来…

Tab Bar Animation

2019独角兽企业重金招聘Python工程师标准>>> 自定义UITabBar。自定义Tab Bar切换过程中的动画效果。用户点击某个Tab&#xff0c;一个小箭头会从之前的Tab上面移动到当前点击的Tab上面。可以在tab上面加上小箭头用于显示当前处于哪个tab。 Code4App编译测试&#xf…

CynosDB技术详解——存储集群管理

本文由腾讯云数据库发表 前言 CynosDB是架构在CynosFS之上的分布式关系数据库系统&#xff0c;为最大化利用存储资源&#xff0c;平衡资源之间的竞争&#xff0c;检查资源使用情况&#xff0c;需要一套高效稳定的分布式集群管理系统&#xff08;SCM: Storage Cluster Manager&a…

linux进程间通信:system V消息队列

文章目录基本介绍编程接口代码实例消息队列的发送和接收消息队列中的消息对象的属性控制基本介绍 支持不同进程之间以消息&#xff08;messages&#xff09;的形式进行数据交换&#xff0c;消息能够拥有自己的标识&#xff0c;且内核使用链表方式进行消息管理。进程之间的通信…

将一个一维数组转化为二进制表示矩阵。例如_算法之矩阵最大区域问题

例如&#xff1a;给定一个m*m(0<n)的矩阵&#xff0c;请找到此矩阵的一个子矩阵&#xff0c;并且此子矩阵的各个元素的和最大&#xff0c;输出这个最大的值。或者给出一个柱形矩阵求最大子矩阵的最大值。首先我们需要了解一下最大字段和问题。最大子段和问题给定一个长度为n…

伪元素first-letter

用于设置一个块级元素首位字符的样式&#xff0c;而且仅对该字符设置样式 p&#xff1a;first-letter{ font-size&#xff1a;200%}是让P中的第一个字符是其他字符大小的两倍转载于:https://www.cnblogs.com/damade/p/3518583.html

fedora17 的 rc.local

Fedora17上已经找不到/etc/rc.local了&#xff0c;如果我们想开机执行某个脚本&#xff0c;就需要手动创建这个文件&#xff0c;目录也发生了小小变化&#xff1a; 1. 新建文件/etc/rc.d/rc.local&#xff0c;第一行须指明执行shell&#xff1a; [root www.linuxidc.com rc.d]#…

使用TortoiseGit,设置ssh方式连接git仓库。

开始设置之前的准备&#xff1a;建立项目文件夹&#xff0c;初始化git仓库(右键 git init)&#xff0c;右键打开 git bash &#xff0c;git pull “仓库地址”, 把网站上的仓库代码拉取下来。 TortoiseGit使用扩展名为ppk的密钥&#xff0c;而不是ssh-keygen生成的rsa密钥。 也…

linux进程间通信:消息队列实现双端通信

双端通信描述 利用消息队列针对发送接受消息的类型唯一性 进行多个客户端之间消息传递&#xff0c;而不需要server端进行消息转发。 同时消息队列的读阻塞和写阻塞特性&#xff08;消息队列中已经写入数据&#xff0c;如果再不读出来&#xff0c;则无法再次写入&#xff09;让…

windows 软件安装事件_苹果安装windows,报windows支持软件未能存储到所选驱动器

今天去给一个IT外包客户维修电脑&#xff0c;前台的一台苹果电脑需要安装双系统&#xff0c;苹果电脑安装双系统对我们专业安装系统工程师来说&#xff0c;这不是很简单的嘛&#xff01;客户问需要多长时间&#xff0c;信心满的说一到两个小时&#xff01;客户说那你开始弄吧。…

C# Attribute简介

一 、EventAttribute有&#xff1a; BrowsableAttribute 、CategoryAttribute、DescriptionAttribute、DefaultEventAttribute PropertyAttribute有&#xff1a; BrowsableAttribute 、CategoryAttribute、DescriptionAttribute、 DefaultPropertyAttribute、DefaultValueAttri…

P2P之UDP穿透NAT的原理

关键词: P2P UDP NAT 原理 穿透 Traveral Symmetric Cone原始作者: Hwycheng Leo(FlashBTHotmail.com)源码下载: http://bbs.hwysoft.com/download/UDP-NAT-LEO.rar参考&#xff1a;http://midcom-p2p.sourceforge.net/draft-ford-midcom-p2p-01.txt P2P之UDP穿透NAT的原理…

快速幂运算and 快速乘运算

ll qpow(ll a,ll b) {ll ans1;while(b){if(b&1) ans(ans*a)%mod;a(a*a)%mod;b>>1;}return ans; } 快速乘运算 ll mult(ll a,ll b,ll mod) {a%mod,b%mod;ll sa,sum0;while(b){if (b&1){sums;if (sum>mod)sum-mod;}b>>1;s<<1;if (s>mod)s-mod;}r…

linux进程间通信:system V 共享内存

文章目录思维导图如下通信原理优势运行流程编程接口编程实例思维导图如下 通信原理 多个进程共享物理内存的同一块区域&#xff08;通常称之为“段”:segment&#xff09;抛弃了内核态消息转存处理的过程&#xff0c;让两个进程直接通过一块内存进行通信 我们普通的像PIPE,FI…

python函数手册68_直接在python中检索68个内置函数?

Python 3.5中的一种方法是列出具有__module__属性的对象,并将其设置为builtins和lowercase name&#xff1a;>>> sorted(k for k, v in vars(__builtins__).items()if k.islower() and getattr(v, __module__, ) builtins)[__build_class__, __import__, abs, all, a…

《深入理解Java虚拟机》笔记3

垃圾收集算法 (1)标记清除 根据根搜索确定对象是否已死&#xff0c;已死对象标记&#xff0c;然后一起清除。 这个其实不算什么算法&#xff0c;最正常想法应该就是这样。但是&#xff0c;缺点 是效率不高&#xff0c;如果有很多不连续的小对象需要回收&#xff0c;会花好多时间…