iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >如何提高MySQL响应速度
  • 453
分享到

如何提高MySQL响应速度

2024-04-02 19:04:59 453人浏览 泡泡鱼
摘要

如何提高Mysql响应速度,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、概述二、应用场景mysql自身的局限性,很多站点都

如何提高Mysql响应速度,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

一、概述

如何提高MySQL响应速度

二、应用场景

mysql自身的局限性,很多站点都采用了Mysql+Memcached的经典架构,甚至一些网站放弃MySQL而采用NoSQL产品,比如Redis/mongoDB等。不可否认,在做一些简单查询(尤其是PK查询)的时候,很多NoSQL产品比MySQL要快很多,而且前台网站上的80%以上查询都是简洁的查询业务。

MySQL通过HandlerSocket插件提供了api访问接口,在我们的基准测试中,普通的R510服务器单实例Percona/XtraDB达到了72W+QPS(纯读),如果采用更强劲的CPU增加更多的网卡,理论上可以获得更高的性能。而同等条件下Memcached仅有40W+QPS(纯读),并且在R510上Memcached单实例已经无法提升性能,因为Memcached对内存的一把大限制了它的并发能力。

Innodb引擎、按主键、unique key或索引搜索(也就是说它的SQL的where条件必须是这些);支持limit 语句、IN、INSERT/UPDATE/DELETE。

  • 没有主键、unique key或索引搜索不行!

  • 表必须是Innodb引擎

HandlerSocket和NoSQL这两者主要的使用场景不同。HandlerSocket主要是用于改善MySQL,优化表格的增删改查以及表格的结构修改等操作,支持密集型CPU操作;而NoSQL作为缓存的功能,支持密集型I/O的操作。

因此,当有需要的时候,可以结合这两者共同工作。

三、原理

HandlerSocket是MySQL的一个插件,集成在mysqld进程中;NoSQL无法实现的复杂查询等操作,仍然使用MySQL自身的关系型数据库实现。在运维层面,原来广泛使用的MySQL主从复制等经验继续发挥作用,相比其他NoSQL产品,数据安全更有保障,原理如图:

如何提高MySQL响应速度

可以看出,HandlerSocket绕过MySQL的SQL解析层(SQL Layer),直接访问MySQL存储层。另外,HandlerSocket采用epoll和worker thread/thread pooling网络架构,性能更高。

MySQL的架构是“数据库管理”和“数据管理”分离,即MySQL Server+Storage Engine的模式。MySQL Server是直接与Client交互的一层,它负责管理连接线程,解析SQL生成执行计划,管理和实现视图、触发器、存储过程等这些与具体数据操作管理无关的事情,通过调用Handler API让存储引擎去操作具体的数据。Storage Engine通过继承实现Handler API的函数,负责直接与数据交互,数据存取实现(必须实现),事务实现(可选),索引实现(可选),数据缓存实现(可选)。

如何提高MySQL响应速度

HandlerSocket是在MySQL的内部组件,以MySQL Daemon Plugin的形式提供类似NoSQL的网络服务,它并不直接处理数据,只是侦听配置好的某个端口方式,接收采用NoSQL/API的通讯协议,然后通过MySQL内部的Handler API来调用存储引擎(例如InnoDB)处理数据。理论上,HanderSocket可以处理各种MySQL存储引擎,但是用MyISAM时,会出现插入的数据查不出来,这个实际上是构造行时第一字节没有初始化为0xff,初始化以后就没有问题,MyISAM也一样可以支持,但是为了更好地利用内存,用HandlerSocket都会搭配InnoDB存储引擎一起使用。

如何提高MySQL响应速度

从上图可以看出,HandlerSocket作为mysql客户端和mysql的中间层,取代mysql原生的部分数据、表格处理工作,采用多线程的方式,区分DDL和DML进行操作。这样的目的是保证在复杂处理的情况下,能够高效的进行处理。

因为HandlerSocket是以MySQL Daemon Plugin形式存在,所以在应用中,可把MySQL当NoSQL使用。它最大的功能是实现了与存储引擎交互,比如InnoDB,而这不需要任何SQL方面的初始化开销。访问MySQL的TABLE时,当然也是需要open/close table的,但是它并不是每次都去open/close table,因为它会将以前访问过的table cache保存下来以重复使用,而opening/closing tables是最耗资源的,而且很容易引起互斥量的争夺,这样一来,对于提高性能非常有效。在流量变小时,HandlerSocket会close tables,所以它一般不会阻塞DDL。

HandlerSocket与MySQL+Memcached的区别在哪呢?对比图1-2和图1-3,可从中看出其不同点,图1-3展示了典型的MySQL+Memecached的应用架构。因为Memcached的get操作比MySQL的内存中或磁盘上的主键查询要快很多,所以Memcached用于缓存数据库记录。若是HandlerSocket的查询速度和相应时间能与Memcached媲美,我们就可以考虑替换Memcached缓存记录的架构层。

如何提高MySQL响应速度

四、优势劣势

HandlerSocket的优势和特点

1) 支持多种查询模式

HandlerSocket目前支持索引查询(主键索引和非主键的普通索引均可),索引范围扫描,LIMIT子句,也即支持增加、删除、修改、查询完整功能,但还不支持无法使用任何索引的操作。另外支持execute_multi() 一次网络传输多个Query请求,节省网络传输时间。

2) 处理大量并发连接

HandlerSocket的连接是轻量级的,因为HandlerSocket采用epoll() 和worker-thread/thread-pooling架构,而MySQL内部线程的数量是有限的(可以由my.cnf中的handlersocket_threads/handlersocket_threads_wr参数控制),所以即使建立上千万的网络连接到HandlerSocket,也不会消耗很多内存,它的稳定性不会受到任何影响(消耗太多的内存,会造成巨大的互斥竞争等其他问题,如bug#26590,bug#33948,bug#49169)。

3) 优秀的性能

HandlerSocket的性能见文章HandlerSocket的性能测试报告描述,相对于其它NoSQL产品,性能表现一点也不逊色,它不仅没有调用与SQL相关的函数,还优化了网络/并发相关的问题:

  • 更小的网络数据包:和传统 MySQL 协议相比,HandlerSocket 协议更简短,因此整个网络的流量更小。

  • 运行有限的MySQL内部线程数:参考上面的内容。

  • 将客户端请求分组:当大量的并发请求到达HandlerSocket时,每个工作线程尽可能多地聚集请求,然后同时执行聚集起来的请求和返回结果。这样,通过牺牲一点响应时间,而大大地提高性能。例如,可以减少fsync()调用的次数,减少复制延迟。

4) 无重复缓存

当使用Memcached缓存MySQL/InnoDB记录时,在Memcached和InnoDB Buffer Pool中均缓存了这些记录,因此效率非常低(实际上有两份数据,Memcached本身可能还需要做HA支持),而采用 HandlerSocket插件, 它直接访问 InnoDB 存储引擎,记录缓存在InnoDB Buffer Pool,于是其它SQL语句还可以重复使用缓存的数据。

5) 无数据不一致的现象

由于数据只存储在一个地方(InnoDB存储引擎缓存区内),不像使用Memcached时,需要在Memcached和MySQL之间维护数据一致性。

6) 崩溃安全

后端存储是InnoDB引擎,支持事务的ACID特性,能确保事务的安全性,即使设置innodb_flush_log_at_trx_commit=2,若数据库服务器崩溃时,也只会丢掉<= 1s的数据。

7) SQL/NOSQL并存

在许多情况下,我们仍然希望使用SQL(例如复杂的报表查询),而大多数NoSQL产品都不支持SQL接口,HandlerSocket仅仅是一个 MySQL 插件,我们依然可以通过MySQL客户端发送SQL语句,但当需要高吞吐量和快速响应时,则使用 HandlerSocket。

8) 继承MySQL的功能

因为HandlerSocket运行于MySQL,因此所有MySQL的功能依然被支持,例如:SQL、在线备份、复制、HA、监控等等。

9) 不需要修改/重建MySQL

因为HandlerSocket是一个插件并且开源,所以它支持从任何MySQL源码、甚至是第三方版本(例如Percona)构建,而无需对MySQL做出任何修改。

10) 独立于存储引擎

虽然我们只测试了MySQL-EnterpriseInnoDB和Percona XtraDB插件,但HandlerSocket理论上可以和任何存储引擎交互。MyISAM通过简单的修改也是可以被支持的,但是从数据缓存而利用内存的角度看这个意义不大。

HandlerSocket的缺陷和注意事项

1) 协议不兼容

HandlerSocket API与Memcached API并不兼容,尽管它很容易使用,但仍然需要一点学习来学会如何与HandlerSocket交互。不过我们可以通过重载Memecached函数来翻译到HandlerSocket API。

2) 没有安全功能

与其它NoSQL数据库类似,HandlerSocket不支持安全功能,HandlerSocket的工作线程以系统用户权限运行,因此应用程序可以通过HandlerSocket协议访问所有的表对象,但是可以通过简单的修改协议,在my.cnf中增加一个配置项为密码,连接时通过这个配置的密码验证,当然也可以通过网络防火墙来过滤数据包。

3) 对于磁盘io密集的场景没有优势

对于IO密集的应用场景,数据库每秒无法执行数千次查询,通常只有1-10%的CPU利用率,在这种情况下,SQL解析不会成为性能瓶颈,因此使用HandlerSocket没有什么优势,应当只在数据完全装载到内存的服务器上使用 HandlerSocket。但是对于PCI-E SSD(例如Fusion-IO)设备,每秒可以提供4w+ IOPS,并且IO设备本身消耗CPU比较大,使用HandlerSocket依然具有优势。

五、安装

注意:书上的安装方式已经过时了,版本也较低,不建议使用,建议使用官方的文档进行安装,GitHub地址:https://github.com/DeNA/HandlerSocket-Plugin-for-MySQL

安装文档:Https://github.com/DeNA/HandlerSocket-Plugin-for-MySQL/blob/master/docs-en/installation.en.txt

下载源码:可以通过github直接git clone或者是下载也行

安装步骤:

1. build Handlersocket

./autogen.sh
./configure --with-mysql-source=/work/mysql-5.1.50 --with-mysql-bindir=/work/mysql-5.1.50-linux-x86_64-glibc23/bin  --with-mysql-plugindir=/work/mysql-5.1.50-linux-x86_64-glibc23/lib/plugin

注意:

  • with-mysql-source:MySQL源代码目录

  • with-mysql-bindir:MySQL二进制可执行文件目录(mysql_config所在目录)

  • with-mysql-plugindir:MySQL插件目录

2. 编译

make && make install

3. 配置

编译之后HandleSocket还不能使用,还需要在MySQL配置文件(my.cnf)中增加以下配置:

[mysqld]
# 绑定读请求端口
loose_handlersocket_port = 9998
# 绑定写请求端口
loose_handlersocket_port_wr = 9999
# 读请求线程数
loose_handlersocket_threads = 16
# 写请求线程数
loose_handlersocket_threads_wr = 16
# 设置最大接收连接数
open_files_limit = 65535

这里增加的这些主要是针对HandleSocket的配置,它有两个端口,9998读数据,9999写数据,但通过9998读的效率更高,这里设置处理读写的线程数均为16个,另外为了处理更多并发连接,设置能打开的文件描述符个数为65535

此外,InnoDB的innodb_buffer_pool_size或MyISAM的key_buffy_size配置选项关系到缓存索引,所以尽可能设置大一些,这样才能发挥HandleSocket的潜力。

4. 激活HandleSocket

登陆MySQL执行

mysql> install plugin handlersocket soname 'handlersocket.so';

可以通过show processlist或show plugins来看到HandleSocket

最后需要安装PHP的扩展包php HandlerSocket

安装文档:https://github.com/tz-lom/HSPHP

PHP用法:

Select

<?php 
$c = new \HSPHP\ReadSocket();
$c->connect();
$id = $c->getIndexId('data_base_name', 'table_name', '', 'id,name,some,thing,more');
$c->select($id, '=', array(42)); // SELECT WITH PRIMARY KEY
$response = $c->readResponse();

//SELECT with IN statement
$c = new \HSPHP\ReadSocket();
$c->connect();
$id = $c->getIndexId('data_base_name', 'table_name', '', 'id,name,some,thing,more');
$c->select($id, '=', array(0), 0, 0, array(1,42,3));
$response = $c->readResponse();

Update

<?php
$c = new \HSPHP\WriteSocket();
$c->connect('localhost',9999);
$id = $c->getIndexId('data_base_name','table_name','','k,v');
$c->update($id,'=',array(100500),array(100500,42)); // Update row(k,v) with id 100500 to  k = 100500, v = 42
$response = $c->readResponse(); // Has 1 if OK

$c = new \HSPHP\WriteSocket();
$c->connect('localhost',9999);
$id = $c->getIndexId('data_base_name','table_name','','k,v');
$c->update($id,'=',array(100500),array(100500,42), 2, 0, array(100501, 100502)); // Update rows where k IN (100501, 100502)
$response = $c->readResponse(); // Has 1 if OK

Delete

<?php
$c = new \HSPHP\WriteSocket();
$c->connect('localhost',9999);
$id = $c->getIndexId('data_base_name','table_name','','k,v');
$c->delete($id,'=',array(100500));
$response = $c->readResponse(); //return 1 if OK

Insert

<?php
$c = new \HSPHP\WriteSocket();
$c->connect('localhost',9999);
$id = $c->getIndexId('data_base_name','table_name','','k,v');
$c->insert($id,array(100500,'test\nvalue'));
$response = $c->readResponse(); //return array() if OK

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网数据库频道,感谢您对编程网的支持。

您可能感兴趣的文档:

--结束END--

本文标题: 如何提高MySQL响应速度

本文链接: https://www.lsjlt.com/news/56591.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何提高MySQL响应速度
    如何提高MySQL响应速度,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。一、概述二、应用场景MySQL自身的局限性,很多站点都...
    99+
    2024-04-02
  • AJAX如何提高客户端响应速度
    这篇文章将为大家详细讲解有关AJAX如何提高客户端响应速度,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 理论上AJAX技术在很大的程度上可...
    99+
    2024-04-02
  • 如何提高AJAX客户端响应速度
    这篇文章主要介绍“如何提高AJAX客户端响应速度”,在日常操作中,相信很多人在如何提高AJAX客户端响应速度问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何提高AJAX客户...
    99+
    2024-04-02
  • php项目的响应速度如何提高
    这期内容当中小编将会给大家带来有关php项目的响应速度如何提高,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。PHP开发环境搭建工具有哪些一、phpStudy,是一个新手入门最常用的开发环境。二、WampS...
    99+
    2023-06-14
  • ASP API响应开发技术:如何提高响应速度?
    ASP API是一种常见的后端开发技术,用于构建Web API或RESTful API。在API开发中,响应速度是一个非常重要的指标,因为快速响应可以提高用户体验和API的可用性。本文将介绍一些ASP API响应开发技术,帮助你提高API...
    99+
    2023-06-26
    api 响应 开发技术
  • 如何提高香港服务器响应速度
    提高香港服务器响应速度的方法:1、减少http请求次数;2、尽量使用静态页面;3、优化香港服务器网站代码;4、利用香港服务器里面的Gzip页面压缩功能;5、对香港服务器的网站使用iframe嵌入网络广告;6、提高香港服务器的配置。具体内容如...
    99+
    2024-04-02
  • 实时日志如何提高ASP响应速度?
    ASP(Active Server Pages)是一种动态网页开发技术,它使用VBScript或JScript来编写脚本,通过IIS(Internet Information Services)来处理HTTP请求,并生成动态网页。在ASP...
    99+
    2023-07-21
    响应 实时 日志
  • 如何利用PHP索引提高响应速度?
    PHP是一种非常流行的Web编程语言,它被广泛应用于各种Web应用程序的开发中。在开发Web应用程序时,一个非常重要的问题就是如何提高响应速度,使得用户可以更快地获取到需要的信息。在这篇文章中,我们将介绍如何利用PHP索引来提高响应速度。 ...
    99+
    2023-07-01
    响应 索引 并发
  • ASP.NET MVC 如何使用索引提高响应速度?
    在处理大量数据时,ASP.NET MVC 应用程序可能会变得非常缓慢,这可能会降低用户体验并导致用户流失。为了解决这个问题,可以使用索引来提高 ASP.NET MVC 应用程序的响应速度。在本文中,我们将探讨什么是索引以及如何在 ASP....
    99+
    2023-08-12
    索引 响应 spring
  • 如何提高网站服务器的响应速度
    提高网站服务器响应速度的方法:1、使用服务器搭建网站程序时,需要减少http请求数,从而提高网站响应速度;2、给网站服务器接入CDN加速工具,从而改善网络环境,给予用户良好的体验感;3、选择域名解析速度快的DNS服务器,从而降低DNS查询时...
    99+
    2024-04-02
  • Go、Git和Unix:如何提高Web应用的响应速度?
    随着互联网的发展,Web应用的响应速度越来越受到关注。用户的耐心越来越短,对于网站或应用程序的响应速度要求越来越高。在这种情况下,如何提高Web应用的响应速度成为了一个重要的问题。本文将介绍如何利用Go、Git和Unix来提高Web应用的...
    99+
    2023-07-28
    git 响应 unix
  • PHP API Load 开发技术:如何提高响应速度?
    随着互联网应用的不断发展,API(Application Programming Interface)的重要性也越来越受到人们的重视。而在使用API时,响应速度是一个非常重要的指标。本文将介绍一些PHP API Load开发技术,以帮助您...
    99+
    2023-06-08
    api load 开发技术
  • 如何在 PHP 中使用 NumPy 以提高响应速度?
    PHP 是一种广泛使用的编程语言,主要用于 Web 开发。然而,PHP 的响应速度并不总是能够满足开发者的需求。为了提高响应速度,开发者可以使用 NumPy 库。NumPy 是一个用于处理大型多维数组和矩阵的 Python 库,它提供了高效...
    99+
    2023-08-30
    numy numpy 响应
  • 如何优化 Java 路径以提高 Load 响应速度?
    Java 是一种广泛使用的编程语言,许多企业都在使用 Java 应用程序来提供服务。在 Java 应用程序中,路径是非常重要的。路径是指用于查找文件、资源、目录和类的字符串。在 Java 应用程序中,路径的优化可以提高应用程序的 Load ...
    99+
    2023-07-27
    path 响应 load
  • 大数据存储中,Java如何提高响应速度?
    随着大数据应用场景的不断扩大,大数据存储成为了一个重要的领域。而Java作为一种主流的编程语言,也逐渐成为大数据存储的首选语言之一。在大数据存储中,Java如何提高响应速度呢?本文将会从以下几个方面进行探讨。 一、优化IO操作 Java中的...
    99+
    2023-08-13
    大数据 存储 响应
  • 如何提高MySQL查询速度
    本篇文章为大家展示了如何提高MySQL查询速度,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。  提高MySQL查询速度有哪些策略  1.表设计一定要优化,冗余数据最...
    99+
    2024-04-02
  • ASP和Linux:如何使用数组来提高响应速度?
    对于网站开发者来说,提高网站的响应速度是至关重要的。ASP和Linux是两个常用的开发平台,它们都有自己的优点和缺点。但是,无论你使用哪种平台,使用数组来提高响应速度都是一个非常有效的方法。 在ASP中,数组可以用来存储大量的数据,并且可...
    99+
    2023-10-27
    linux 响应 数组
  • 如何在 PHP 中使用数组来提高响应速度?
    PHP 是一种强大的编程语言,广泛用于 Web 应用程序的开发。当处理大量数据或需要快速响应用户请求时,PHP 数组成为一种重要的工具。在本文中,我们将探讨如何使用 PHP 数组来提高响应速度。 PHP 数组是一种非常灵活的数据结构,可以存...
    99+
    2023-08-31
    数组 学习笔记 响应
  • 如何提高mysql的查询速度
    这篇文章主要讲解了“如何提高mysql的查询速度”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何提高mysql的查询速度”吧! ...
    99+
    2024-04-02
  • ASP中如何实现异步编程以提高响应速度?
    在互联网时代,用户对网站的响应速度要求越来越高,而网站的响应速度与服务器端的性能息息相关。ASP是一种非常流行的服务器端开发语言,它的高性能和易用性使得它成为了众多网站的首选。但是,ASP在处理大量并发请求时会遇到性能瓶颈,这时候就需要使...
    99+
    2023-10-27
    异步编程 响应 leetcode
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作