cari
Rumahpangkalan datatutorial mysql详解MySQL下InnoDB引擎中的Memcached插件_MySQL

前些年,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> make
shell> make install
shell> cd /usr/local/mysql
shell> 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.server

MySQL安装完毕后,在插件目录我们能看到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 VARIABLES 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
VALUE @@aaa.AA 8 12
HELLO, HELLO
END

我们还可以先设定缺省访问的表,然后后续的查询就只写键名就可以了:
 

shell> (echo "get @@aaa"; echo "get AA") | nc localhost 11211
VALUE @@aaa 0 14
test/demo_test
END
VALUE AA 8 12
HELLO, HELLO
END

虽然我的例子都是通过命令行执行的,但是大家很容易就更改写成PHP之类的方法。
限制

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

此外,containers表还有如下限制:

  •     key_columns字段的类型必须是CHAR或VARCHAR,且最大长度是250个字符。
  •     value_columns字段的类型必须是CHAR或VARCHAR或BLOB,长度不限。
  •     cas_column字段的类型必须是BIGINT。
  •     expiration_time_column字段的类型必须是INT。
  •     flags字段的类型必须是INT。

说明:随着MySQL版本的更新,这些限制可能会发生变化,请大家以实际情况为准。
实战

让我们以一个用户登录的例子来检验一下学习成果:

首先在测试数据库创建一个用户表:
 

USE `test`
 
CREATE TABLE `users` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(15) NOT NULL,
  `password` VARCHAR(32) NOT NULL,
  `email` VARCHAR(50) NOT NULL,
  `flags` INT(10) UNSIGNED DEFAULT '0',
  `cas_column` BIGINT(20) UNSIGNED DEFAULT '0',
  `expire_time_column` INT(10) UNSIGNED DEFAULT '0',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB;

然后添加几行测试数据:
 

INSERT INTO `users` (`username`, `password`, `email`)
VALUES
('foo', 'ffffffffffffffffffffffffffffffff', 'foo@domain.com'),
('bar', 'bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb', 'bar@domain.com');

接着在containers里配置这个表:
 

INSERT INTO innodb_memcache.containers (
  name, db_schema, db_table, key_columns, value_columns,
  flags, cas_column, expire_time_column, unique_idx_name_on_key
) VALUES (
  'default', 'test', 'users', 'username', 'password|email',
  'flags', 'cas_column', 'expire_time_column', 'username'
);

这里我们定义了多个字段(password和email)作为value_columns,并且使用竖线作为分隔符,实际上使用空格,逗号之类分隔符也可以,在innodb_config.c文件的源代码中能查到如下关于分隔符的定义,文档里并没有涵盖这些信息:
 

static const char* sep = " ;,|\n";

最后使用Memcached协议来访问一下,这里我们换个花样,执行一个MGET操作:
 

shell> echo "get foo bar" | nc localhost 11211
VALUE foo 0 47
ffffffffffffffffffffffffffffffff|foo@domain.com
VALUE bar 0 47
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb|bar@domain.com
END

既然我定义value_columns的时候设置了多个字段,那么返回数据的时候自然也返回多个字段的数据,并且它们依照innodb_memcache.config_options表中的separator字段来分隔,缺省情况下是一个竖线,如果你的字段内容里包含了竖线,那么就会和缺省值发生冲突,此时你可以更新separator的定义,比如改成三个竖线等等,需要提醒的是,修改后别忘了重启Memcached插件。

说明:因为们在配置的时候把表命名为default,所以在请求的时候不用传递表名。如果不存在default,那么会把名字按照字母顺序正序排列,排在第一位的就是缺省。

本文在使用Memcached插件的时候,所有例子均使用的是读操作,实际上写操作也是支持的,不过在实际使用时,我更倾向于写操作都通过SQL来执行,而Memcached插件仅处理KV形式的读操作,实际压力测试的结果显示,Memcached插件比SQL的方式,性能提升了百分之一百左右,虽然仍不及独立的Memcached,但考虑到其它的优势,这个结果已经很让人欣喜了,下一站,InnoDB的Memcached插件!大家做好准备吧。

Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Bagaimanakah kardinaliti indeks MySQL mempengaruhi prestasi pertanyaan?Bagaimanakah kardinaliti indeks MySQL mempengaruhi prestasi pertanyaan?Apr 14, 2025 am 12:18 AM

Cardinality Indeks MySQL mempunyai kesan yang signifikan terhadap prestasi pertanyaan: 1. Indeks kardinaliti yang tinggi dapat lebih berkesan menyempitkan julat data dan meningkatkan kecekapan pertanyaan; 2. Indeks kardinaliti yang rendah boleh membawa kepada pengimbasan jadual penuh dan mengurangkan prestasi pertanyaan; 3. Dalam indeks bersama, urutan kardinaliti yang tinggi harus diletakkan di depan untuk mengoptimumkan pertanyaan.

MySQL: Sumber dan Tutorial untuk Pengguna BaruMySQL: Sumber dan Tutorial untuk Pengguna BaruApr 14, 2025 am 12:16 AM

Laluan pembelajaran MySQL termasuk pengetahuan asas, konsep teras, contoh penggunaan, dan teknik pengoptimuman. 1) Memahami konsep asas seperti jadual, baris, lajur, dan pertanyaan SQL. 2) Ketahui definisi, prinsip kerja dan kelebihan MySQL. 3) menguasai operasi CRUD asas dan penggunaan lanjutan, seperti indeks dan prosedur yang disimpan. 4) Biasa dengan debugging kesilapan biasa dan cadangan pengoptimuman prestasi, seperti penggunaan rasional indeks dan pertanyaan pengoptimuman. Melalui langkah -langkah ini, anda akan memahami sepenuhnya penggunaan dan pengoptimuman MySQL.

Mysql dunia nyata: Contoh dan kes penggunaanMysql dunia nyata: Contoh dan kes penggunaanApr 14, 2025 am 12:15 AM

Aplikasi dunia nyata MySQL termasuk reka bentuk pangkalan data asas dan pengoptimuman pertanyaan kompleks. 1) Penggunaan Asas: Digunakan untuk menyimpan dan mengurus data pengguna, seperti memasukkan, menanyakan, mengemas kini dan memadam maklumat pengguna. 2) Penggunaan lanjutan: Mengendalikan logik perniagaan yang kompleks, seperti perintah dan pengurusan inventori platform e-dagang. 3) Pengoptimuman Prestasi: Meningkatkan prestasi dengan menggunakan indeks, jadual partisi dan cache pertanyaan.

Perintah SQL di MySQL: Contoh PraktikalPerintah SQL di MySQL: Contoh PraktikalApr 14, 2025 am 12:09 AM

Perintah SQL di MySQL boleh dibahagikan kepada kategori seperti DDL, DML, DQL, dan DCL, dan digunakan untuk membuat, mengubah suai, memadam pangkalan data dan jadual, memasukkan, mengemas kini, memadam data, dan melakukan operasi pertanyaan yang kompleks. 1. Penggunaan asas termasuk jadual penciptaan createtable, memasukkan data memasukkan, dan pilih data pertanyaan. 2. Penggunaan lanjutan melibatkan gabungan untuk Jadual Bergabung, Subqueries dan Groupby untuk Agregasi Data. 3. Kesilapan umum seperti kesilapan sintaks, jenis data yang tidak sepadan dan masalah kebenaran boleh disahpepijat melalui pemeriksaan sintaks, penukaran jenis data dan pengurusan kebenaran. 4. Cadangan Pengoptimuman Prestasi termasuk menggunakan indeks, mengelakkan pengimbasan jadual penuh, mengoptimumkan operasi gabungan dan menggunakan transaksi untuk memastikan konsistensi data.

Bagaimanakah InnoDB mengendalikan pematuhan asid?Bagaimanakah InnoDB mengendalikan pematuhan asid?Apr 14, 2025 am 12:03 AM

InnoDB mencapai atomik melalui undolog, konsistensi dan pengasingan melalui mekanisme penguncian dan MVCC, dan kegigihan melalui redolog. 1) Atomicity: Gunakan Undolog untuk merekodkan data asal untuk memastikan urus niaga dapat dilancarkan kembali. 2) Konsistensi: Memastikan konsistensi data melalui penguncian peringkat baris dan MVCC. 3) Pengasingan: Menyokong pelbagai tahap pengasingan, dan RepeatableRead digunakan secara lalai. 4) Kegigihan: Gunakan redolog untuk merekodkan pengubahsuaian untuk memastikan data disimpan untuk masa yang lama.

Tempat Mysql: Pangkalan Data dan PengaturcaraanTempat Mysql: Pangkalan Data dan PengaturcaraanApr 13, 2025 am 12:18 AM

Kedudukan MySQL dalam pangkalan data dan pengaturcaraan sangat penting. Ia adalah sistem pengurusan pangkalan data sumber terbuka yang digunakan secara meluas dalam pelbagai senario aplikasi. 1) MySQL menyediakan fungsi penyimpanan data, organisasi dan pengambilan data yang cekap, sistem sokongan web, mudah alih dan perusahaan. 2) Ia menggunakan seni bina pelanggan-pelayan, menyokong pelbagai enjin penyimpanan dan pengoptimuman indeks. 3) Penggunaan asas termasuk membuat jadual dan memasukkan data, dan penggunaan lanjutan melibatkan pelbagai meja dan pertanyaan kompleks. 4) Soalan -soalan yang sering ditanya seperti kesilapan sintaks SQL dan isu -isu prestasi boleh disahpepijat melalui arahan jelas dan log pertanyaan perlahan. 5) Kaedah pengoptimuman prestasi termasuk penggunaan indeks rasional, pertanyaan yang dioptimumkan dan penggunaan cache. Amalan terbaik termasuk menggunakan urus niaga dan preparedStatemen

Mysql: Dari perniagaan kecil ke perusahaan besarMysql: Dari perniagaan kecil ke perusahaan besarApr 13, 2025 am 12:17 AM

MySQL sesuai untuk perusahaan kecil dan besar. 1) Perniagaan kecil boleh menggunakan MySQL untuk pengurusan data asas, seperti menyimpan maklumat pelanggan. 2) Perusahaan besar boleh menggunakan MySQL untuk memproses data besar dan logik perniagaan yang kompleks untuk mengoptimumkan prestasi pertanyaan dan pemprosesan transaksi.

Apa yang dibaca oleh Phantom dan bagaimana InnoDB menghalang mereka (kunci seterusnya)?Apa yang dibaca oleh Phantom dan bagaimana InnoDB menghalang mereka (kunci seterusnya)?Apr 13, 2025 am 12:16 AM

InnoDB secara berkesan menghalang pembacaan hantu melalui mekanisme utama. 1) Kekunci seterusnya menggabungkan kunci baris dan kunci jurang untuk mengunci rekod dan jurang mereka untuk mengelakkan rekod baru daripada dimasukkan. 2) Dalam aplikasi praktikal, dengan mengoptimumkan pertanyaan dan menyesuaikan tahap pengasingan, persaingan kunci dapat dikurangkan dan prestasi konkurensi dapat ditingkatkan.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

PhpStorm versi Mac

PhpStorm versi Mac

Alat pembangunan bersepadu PHP profesional terkini (2018.2.1).

MantisBT

MantisBT

Mantis ialah alat pengesan kecacatan berasaskan web yang mudah digunakan yang direka untuk membantu dalam pengesanan kecacatan produk. Ia memerlukan PHP, MySQL dan pelayan web. Lihat perkhidmatan demo dan pengehosan kami.

Versi Mac WebStorm

Versi Mac WebStorm

Alat pembangunan JavaScript yang berguna

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

MinGW - GNU Minimalis untuk Windows

MinGW - GNU Minimalis untuk Windows

Projek ini dalam proses untuk dipindahkan ke osdn.net/projects/mingw, anda boleh terus mengikuti kami di sana. MinGW: Port Windows asli bagi GNU Compiler Collection (GCC), perpustakaan import yang boleh diedarkan secara bebas dan fail pengepala untuk membina aplikasi Windows asli termasuk sambungan kepada masa jalan MSVC untuk menyokong fungsi C99. Semua perisian MinGW boleh dijalankan pada platform Windows 64-bit.