详解MySQL下InnoDB引擎中的Memcached插件

合集下载

MySQL中的存储空间管理和释放技巧

MySQL中的存储空间管理和释放技巧

MySQL中的存储空间管理和释放技巧MySQL是一种常用的开源关系型数据库管理系统,被广泛应用于各种规模的企业和个人项目中。

随着数据量的增长和系统负载的增大,存储空间管理成为了MySQL数据库管理员面临的重要问题之一。

本文将就MySQL中的存储空间管理和释放技巧展开讨论。

一、MySQL存储空间管理基础MySQL的存储引擎是其存储空间管理的核心组成部分。

MySQL支持多种存储引擎,例如InnoDB、MyISAM、Memory等。

每种存储引擎都有其特点和适用场景,不同存储引擎对存储空间的管理方式也略有差异。

1. InnoDB存储引擎InnoDB是MySQL的默认存储引擎,具有ACID事务支持和行级锁定等特性。

InnoDB存储引擎在存储空间管理方面表现较为出色。

它使用了一种称为“聚集索引”的机制,将数据按照主键的顺序进行存储,可以提高查询性能。

同时,InnoDB还支持数据页的压缩和自动扩展等功能,可以有效地管理存储空间。

2. MyISAM存储引擎MyISAM是MySQL的另一种常用的存储引擎,具有全文索引和压缩等特性。

但是,MyISAM在存储空间管理方面相对较弱。

MyISAM使用静态表结构,所有行都具有相同的长度。

这就导致了对于变长字段的存储,可能会浪费较多的存储空间。

此外,MyISAM没有自动压缩和自动扩展功能,需要手动进行优化和维护。

二、MySQL存储空间释放技巧在实际的MySQL数据库管理中,存储空间的释放是一个常见的需求。

下面将介绍一些有效的存储空间释放技巧。

1. 清理未使用的索引索引是MySQL中提高查询性能的重要手段,但是过多或者不必要的索引也会占用较大的存储空间。

通过定期检查和评估索引的使用情况,可以清理掉未使用的索引,释放存储空间。

2. 优化表结构MySQL中的表结构也可以影响存储空间的使用效率。

通过合理设计表结构,可以减少存储空间的浪费。

例如,使用适当的字段类型和长度,避免使用不必要的列等。

MySQL中的查询缓存使用方法

MySQL中的查询缓存使用方法

MySQL中的查询缓存使用方法MySQL是一种最常用的关系型数据库管理系统,广泛应用于各个领域。

在日常的开发中,查询是数据库的常见操作之一。

为了提高查询效率,MySQL引入了查询缓存(Query Cache)的概念。

本文将介绍MySQL中的查询缓存使用方法,帮助读者更好地利用这一特性。

一、什么是查询缓存查询缓存是MySQL中的一种缓存机制,用于缓存查询结果,以提高同样查询的响应速度。

当MySQL收到一个查询请求时,它会先检查查询缓存中是否已经有了相同的查询语句和参数。

如果存在,则直接从缓存中返回结果,而不需要实际执行查询操作。

如果不存在,则执行查询并将结果存入缓存,以备后续使用。

二、查询缓存的使用在MySQL中,查询缓存是默认开启的。

可以通过查看配置文件中的query_cache_type选项来确认查询缓存是否启用。

如果查询缓存未启用,可以在配置文件中进行设置。

1. 配置查询缓存查询缓存的相关配置项包括query_cache_type、query_cache_size和query_cache_limit。

其中,query_cache_type用于启用或禁用查询缓存的功能,具体取值为OFF、ON和DEMAND。

query_cache_size用于设置查询缓存的大小,表示缓存可用于存储查询结果的总内存大小。

query_cache_limit用于设置单个查询结果的最大缓存大小,超过这个值将不会被缓存。

例如,要启用查询缓存并设置缓存大小为100MB,可以在配置文件中添加如下配置:query_cache_type = ONquery_cache_size = 100Mquery_cache_limit = 1M2. 查询缓存的命中与失效当查询缓存启用时,MySQL在执行查询之前会先检查是否有相同的查询已经被缓存。

如果有,就直接返回缓存结果;如果没有,就执行查询并将结果存入缓存。

但是,并非所有的查询都适合使用查询缓存。

mysql8 缓存机制

mysql8 缓存机制

mysql8 缓存机制
MySQL 8 中的缓存机制包括查询缓存和内部缓存两部分。

一、查询缓存(Query Cache):在MySQL 8中,查询缓存默认是禁用的。

这是因为查询缓存带来了一些性能问题,比如对于高并发环境下的写入操作可能会导致缓存失效频繁,而且查询缓存的存储结构不够灵活,不能很好地适应各种查询条件。

因此,MySQL 8 默认情况下不再支持查询缓存。

二、内部缓存(Internal Caches):MySQL 8 中的内部缓存包括了各种存储引擎级别的缓存,比如InnoDB 存储引擎中的缓冲池(Buffer Pool)、MyISAM 存储引擎中的键缓存(Key Cache)等。

这些内部缓存主要用于存储表数据、索引数据以及其他元数据,以提高查询性能和系统吞吐量。

总的来说,在MySQL 8 中,查询缓存已经不再是一个重要的性能优化手段,而内部缓存则是MySQL 性能优化中更为关键和有效的一部分。

因此,对于MySQL 8 的性能优化,更应该关注于合理配置和优化内部缓存,以及通过索引优化、查询优化等手段来提升数据库性能。

MySQL的数据缓存与查询缓存的使用与优化

MySQL的数据缓存与查询缓存的使用与优化

MySQL的数据缓存与查询缓存的使用与优化引言MySQL是目前最为流行的开源关系型数据库管理系统,广泛应用于Web应用开发和数据存储等领域。

在MySQL中,数据缓存和查询缓存是提高数据库性能和查询效率的重要手段。

本文将介绍MySQL的数据缓存和查询缓存的使用方法以及优化技巧。

数据缓存的作用和使用数据缓存是将磁盘上的数据加载到内存中,以加快对数据的访问速度。

在MySQL中,数据缓存是通过使用缓存策略和缓冲区来实现的。

数据库系统会将经常访问的数据块缓存在内存中,从而避免频繁的磁盘IO操作,提高访问效率。

MySQL的数据缓存使用非常简单,只需在配置文件中将缓存大小设置为一个合适的值即可。

一般情况下,可以将数据库表和索引数据缓存到内存中,提高查询性能。

例如,可以将`key_buffer_size`参数设置为适当的大小,以控制索引缓存的大小。

然而,需要注意的是,过大的数据缓存可能会导致内存耗尽,影响系统的稳定性和性能。

因此,在设置数据缓存大小时,需要根据系统的内存情况和实际访问需求进行合理的调整和优化。

查询缓存的作用和使用查询缓存是指将查询结果缓存到内存中,当下次有相同的查询请求时,直接返回缓存中的结果,从而避免再次执行相同的查询语句。

查询缓存能够大幅度提高查询效率,尤其对于频繁执行相同查询的应用场景,效果更加显著。

MySQL的查询缓存使用也相对简单。

只需在配置文件中将`query_cache_type`参数设置为1,并设置一个合适的缓存大小,即可开启查询缓存功能。

此外,还可以根据实际需求调整其他相关参数,如`query_cache_limit`、`query_cache_size`等,以优化查询缓存的效果。

然而,查询缓存在某些情况下可能会产生一些问题和副作用。

例如,当数据库中的表发生更新时,缓存中的查询结果需要被更新或者清空。

此外,查询缓存也可能会导致内存不断增长,占用大量系统资源。

因此,在使用查询缓存的过程中,需要根据实际情况和业务需求进行合理的调整和优化。

在MySQL5.7中使用InnoDB Memcached插件实现每秒100万QPS

在MySQL5.7中使用InnoDB Memcached插件实现每秒100万QPS

在MySQL5.7中使用InnoDB Memcached插件实现每秒100万QPS在上周,Tomas 在MySQL Percona Live Conference in London ,宣布了MySQL 5.7的版本--在只读的(Read-Only)测试环境,InnoDB 的Memcached plugin的版本中,可以处理每秒1,000,000 次的查询。

这个文章就是证实这个说法的。

AD:在上周,Tomas 在MySQL Percona Live Conference in London ,宣布了MySQL 5.7的版本--在只读的(Read-Only)测试环境,InnoDB 的Memcached plugin的版本中,可以处理每秒1,000,000 次的查询。

这个文章就是证实这个说法的。

实际上,我至今也没有准确说法,到底可拓展性有多么的准确和有多少的性能限制在这里面..我们可以在最新的MySQL 5.7 中可以得到最大的性能提升,并且,并且可以让我们轻松的在普通的(normal)SQL 在只读的环境中(Read-Only workload)测试到500K QPS 。

接下来,更多的性能提升在InnoDB Memcached Plugin代码中变为可能,然而,一切都是那么自然。

尤其在Facebook团队,他们突破并展现出巨大的性能点。

当然,Facebook给我们提供了一个测试case,我们也用它来成功的提高了我们代码。

最终,同样的测试案例会在下面的测试评分结果中展示出来;-)这个测试是在独立(standalone)模式上测试的。

(包括服务器,客户端都在上面运行)。

所以,我们使用我们实验室最大的HW box - 一个48核的机器。

这个服务器能够迅速的给我们指出一个存在的,或者潜在的性能瓶颈(最有趣的是,大部分他们都是在memcached代码上面)。

然而,QPS 依赖于内存和CPU。

因此,这台服务器是只有2Ghz的CPU 核,如果有存在其他更快的HW,你可能能得到更好的积分统计:-)现在,比较最好-最好的QPS结果如下:曾经把MySQL5.6放上神坛,给它打上有史以来最好的结果这样的标签;-)) 由于一部分的Memcached代码性能提高也会反过来提高山茶 升MySQL5.6的性能,所以我们也期望在5.6的下一版本中也能运行的良好。

MySQL中的内存优化和缓存配置技巧

MySQL中的内存优化和缓存配置技巧

MySQL中的内存优化和缓存配置技巧MySQL是一种常用的关系型数据库管理系统,被广泛应用于各种网站和应用程序中。

MySQL的性能对于网站和应用程序的响应速度和用户体验至关重要,而内存优化和缓存配置则是提升MySQL性能的关键因素之一。

本文将介绍MySQL 中的内存优化和缓存配置技巧,帮助读者更好地理解和应用这些技术。

一、MySQL内存优化技巧MySQL中的内存优化可以通过调整和配置不同的内存参数来实现。

以下是一些常用的内存优化技巧:1. 增加innodb_buffer_pool_size: InnoDB存储引擎是MySQL中最常用的存储引擎之一,它通过使用内存缓存数据来提高性能。

通过增加innodb_buffer_pool_size参数的值可以提高InnoDB的内存缓存空间,从而加快查询速度。

但需要注意的是,设置过大的值可能导致系统内存不足,反而降低性能。

2. 控制sort_buffer_size和join_buffer_size:sort_buffer_size和join_buffer_size 参数用于控制排序和连接时的内存缓冲区大小。

合理设置这两个参数的值可以提升排序和连接操作的性能,避免使用临时文件进行排序和连接,从而提高查询效率。

3. 调整max_connections:max_connections参数用于控制数据库同时连接的最大数量。

合理设置此参数的值可以避免因过多的连接而导致内存消耗过大,从而提高数据库性能。

但是需要权衡系统资源和并发连接数的需求,避免设置过大导致系统资源不足。

4. 配置tmp_table_size和max_heap_table_size:tmp_table_size和max_heap_table_size参数用于控制临时表的内存缓存大小。

临时表在排序和分组操作中经常被使用,通过增加这两个参数的值可以减少使用磁盘临时表的频率,提高性能。

二、MySQL缓存配置技巧MySQL提供了多种缓存机制来提升查询效率和性能。

memcached工作原理

memcached工作原理

memcached工作原理
memcached是一款高性能的分布式内存缓存系统,主要用于减轻数据库负载,提高应用程序的性能。

其工作原理如下:
1. 客户端向memcached服务器发送请求,请求可以是获取或设置缓存数据。

2. 如果请求是获取缓存数据,memcached服务器首先检查是否有该数据的缓存副本,如果有,则返回该数据给客户端。

3. 如果请求是设置缓存数据,memcached服务器将数据存储到其内存中,并设置相应的索引。

4. 当memcached服务器的内存空间不足时,会采用LRU(最近最少使用)算法将一些旧的缓存数据删除,以腾出更多的内存空间。

5. 当多个memcached服务器组成一个分布式缓存集群时,客户端需要通过一致性哈希算法来选择具体的服务器,以保证缓存数据的一致性。

6. 当客户端对缓存数据进行修改时,需要同时更新所有memcached服务器上的缓存数据,以保证数据一致性。

总之,memcached工作原理简单、高效,可以提高应用程序的响应速度和吞吐
量,同时减少数据库的负载。

详解MemCached原理

详解MemCached原理

详解MemCached原理memcached是⼀个⾼性能的分布式内存缓存服务器,memcached在Linux上可以通过yum命令安装,这样⽅便很多,在⽣产环境下建议⽤Linux系统,memcached使⽤libevent这个库在Linux系统上才能发挥它的⾼性能。

它的分布式其实在服务端是不具有分布式的特征的,是依靠客户端的分布式算法进⾏了分布式,memcached是⼀个纯内存型的数据库,这样在读写速度上相对来说⽐较快。

memcached的内存分配是预先分配内存,常规的程序使⽤内存⽆⾮是两种,⼀种是预先分配,⼀种是动态分配。

动态分配从效率的⾓度来讲相对来说要慢点,因为它需要实时的去分配内存使⽤,但是这种⽅式的好处就是可以节约内存使⽤空间;memcached采⽤的是预先分配的原则,这种⽅式是拿空间换时间的⽅式来提⾼它的速度,这种⽅式会造成不能很⾼效的利⽤内存空间,但是memcached采⽤了Slab Allocation机制来解决内存碎⽚的问题,Slab Allocation的基本原理就是按照预先规定的⼤⼩,将分配的内存分割成特定长度的块,并把尺⼨相同的块分成组(chunk的集合),借⽤⼀下⽹上的图:memcached会针对客户端发送的数据选择slab并缓存到chunk中,这样就有⼀个弊端那就是⽐如要缓存的数据⼤⼩是50个字节,如果被分配到如上图88字节的chunk中的时候就造成了33个字节的浪费,虽然在内存中不会存在碎⽚,但是也造成了内存的浪费,这也是我上⾯说的拿空间换时间的原因,不过memcached对于分配到的内存不会释放,⽽是重复利⽤。

默认情况下如下图chunk是1.25倍的增加的,当然也可以⾃⼰通过-f设置,这种内部的分割算法可以参看源码下的slabs.c⽂件。

memcached本⾝内部不会监视记录是否过期,⽽是当get时依靠记录的过期时间检查是否过期,这也是memcached的⼀种惰性过期机制。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

前些年,HandlerSocket的横空出世让人们眼前一亮,当时我还写了一篇文章介绍了其用法梗概,时至今日,由于种种原因,HandlerSocket并没有真正流行起来,不过庆幸的是MySQL官方受其启发,研发了基于InnoDB的Memcached插件,总算是在MySQL中延续了NoSQL的香火,以前单独架设Memcached服务器不仅浪费了内存,而且还必须自己维护数据的不一致问题,有了Memcached插件,这些问题都不存在了,而且借助MySQL本身的复制功能,我们可以说是变相的实现了Memcached的复制,这更是意外之喜。

安装为了让文章更具完整性,我们选择从源代码安装MySQL,需要注意的是早期的版本有内存泄漏,所以推荐安装最新的稳定版,截至本文发稿时为止,最新的稳定版是5.6.13,我们就以此为例来说明,过程很简单,只要激活了WITH_INNODB_MEMCACHED即可:shell> groupadd mysql shell> useradd -r -g mysql mysql shell> tar zxvf mysql-5.6.13.tar.gz shell> cd mysql-5.6.13 shell> cmake . -DWITH_INNODB_MEMCACHED=ON shell> makeshell> make installshell> cd /usr/local/mysqlshell> chown -R mysql . shell> chgrp -R mysql . shell> scripts/mysql_install_db --user=mysql shell> chown -R root . shell> chown -R mysql data shell> bin/mysqld_safe --user=mysql & shell> cp support-files/mysql.server /etc/init.d/mysql.serverMySQL安装完毕后,在插件目录我们能看到innodb_engine.so和libmemcached.so:mysql> SELECT @@plugin_dir; +------------------------------+ | @@plugin_dir | +------------------------------+ | /usr/local/mysql/lib/plugin/ | +------------------------------+ 此外还需要导入Memcached插件所需要的表结构:mysql> SOURCE /usr/local/mysql/share/innodb_memcached_config.sql一切就绪后就可以激活Memcached插件了(当然如果需要的话也可以禁止):mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so"; mysql> UNINSTALL PLUGIN daemon_memcached;说明:如果要重启插件的话,可以先uninstall,再install。

Memcached插件相关的配置信息如下,具体介绍可以参考官方文档:mysql> SHOW V ARIABLES LIKE '%memcached%'; +----------------------------------+------------------+ | Variable_name | Value | +----------------------------------+------------------+ | daemon_memcached_enable_binlog | OFF | | daemon_memcached_engine_lib_name | innodb_engine.so | | daemon_memcached_engine_lib_path | | | daemon_memcached_option | | | daemon_memcached_r_batch_size | 1 | | daemon_memcached_w_batch_size | 1 | +----------------------------------+------------------+注意:daemon_memcached_r_batch_size和daemon_memcached_w_batch_size,这两个选项对性能影响较大,简单点说就是控制事务提交的频率,MySQL的缺省值均为1,也就是说每次都提交,这主要是从安全性考虑的,大家可以依照自己的情况来调整。

差不多了,此时Memcached端口应该准备就绪了,你可以试试看:shell> echo "stats" | nc localhost 11211换句话说,MySQL已经兼容Memcached协议,可以直接使用Memcached命令。

配置在安装步骤里,我们导入了一个名为innodb_memcached_config.sql的脚本,它创建了一库(innodb_memcache)三表(cache_policies, config_options, containers):mysql> USE innodb_memcache mysql> SHOW TABLES; +---------------------------+ | Tables_in_innodb_memcache | +---------------------------+ | cache_policies | | config_options | | containers | +---------------------------+cache_policies定义了缓存策略,包含如下选择:innodb_only:只使用InnoDB作为数据存储。

cache-only:只使用传统的Memcached引擎作为后端存储。

caching:二者皆使用,如果在Memcached里找不到,就查询InnoDB。

config_options定义了分隔符号:separator:Memcached只识别单值,使用此分隔符(|)来连接多个字段的值。

table_map_delimiter:通过此分隔符(.)来确认表和键,如:@@table.key。

如果我们想通过Memcached协议来访问一个表,需要先在containers中配置它:mysql> SELECT * FROM containers\G *************************** 1. row *************************** name: aaa db_schema: test db_table: demo_test key_columns: c1 value_columns: c2 flags: c3 cas_column: c4 expire_time_column: c5 unique_idx_name_on_key: PRIMARY如上已经有了test数据库的demo_test表,通过c1查询c2的值,表结构如下所示:mysql> DESC test.demo_test; +-------+---------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+---------------------+------+-----+---------+-------+ | c1 | varchar(32) | NO | PRI | | | | c2 | varchar(1024) | YES | | NULL | | | c3 | int(11) | YES | | NULL | | | c4 | bigint(20) unsigned | YES | | NULL | | | c5 | int(11) | YES | | NULL | | +-------+---------------------+------+-----+---------+-------+缺省情况下有一行数据:mysql> SELECT * FROM test.demo_test; +----+--------------+------+------+------+ | c1 | c2 | c3 | c4 | c5 | +----+--------------+------+------+------+ | AA | HELLO, HELLO | 8 | 0 | 0 | +----+--------------+------+------+------+让我们用Memcached协议来访问看看:shell> echo "get @@aaa.AA" | nc localhost 11211 V ALUE @@aaa.AA 8 12 HELLO, HELLO END我们还可以先设定缺省访问的表,然后后续的查询就只写键名就可以了:shell> (echo "get @@aaa"; echo "get AA") | nc localhost 11211 V ALUE @@aaa 0 14 test/demo_test ENDV ALUE AA 8 12 HELLO, HELLO END虽然我的例子都是通过命令行执行的,但是大家很容易就更改写成PHP之类的方法。

限制Memcached插件用起来非常简单,不过并不是一切都很完美,比如说:当我们配置表的时候,containers表的字段,除了key_columns和value_columns以外,其它的字段,如:flags,cas_column,expire_time_column等也必须设定,可是很多时候,我们在原表中找不到贴切的字段,此时就只能对应新建三个字段,味道很恶心。

相关文档
最新文档