MySQL 51简体中文手册 第16章:编写自定义存储引擎
- 格式:doc
- 大小:89.00 KB
- 文档页数:23
深⼊mysql创建⾃定义函数与存储过程的详解在使⽤mysql的过程中,mysql⾃带的函数可能不能完成我们的业务需求,这时就需要⾃定义函数,例如笔者在开发过程中遇到下⾯这个问题:复制代码代码如下:DROP TABLE IF EXISTS `test`;CREATE TABLE `test` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`pic` varchar(50) NOT NULL,`hashcode` varchar(16) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;-- ------------------------------ Records of test-- ----------------------------INSERT INTO `test` VALUES ('1', '2012120910403250c3fa209bf48.jpg', 'bf8f83818080c0f1');INSERT INTO `test` VALUES ('2', '2012120620430750c092db26557.JPG', 'ff9880f0f680ceff');INSERT INTO `test` VALUES ('3', '2012120619582550c08861eb062.jpg', '7f7f004f7f7f7c7f');INSERT INTO `test` VALUES ('4', '2012112911072650b6d16e7f21f.jpg', '7f7f004f7f7f007f');其中pic字段为图⽚名称,hashcode是图⽚的感知哈希编码(16进制编码字符串,长度固定16位),⽤户输⼊⼀个hashcode,怎么从数据库中找出满⾜字符串对应位置的字符不同的个数⼩于5的记录呢?就像“11001”和“11101”对应位置不同字符不同的个数为1,⽐如⽤户输⼊"7f7f004f7f7f00af",那么第三条和第四条记录是满⾜的,怎么实现呢?如果单纯的依靠mysql⾃带的函数很难完成,这时就需要建⽴⾃定义函数解决。
如何在MySQL中使用存储引擎引言:MySQL是一个开源的关系型数据库管理系统,广泛应用于各类应用程序中。
在MySQL中,存储引擎是对数据的存储和访问进行管理的组件。
MySQL提供了多种存储引擎供用户选择和使用,每种存储引擎都有其特定的优势和适用场景。
本文将介绍MySQL中常见的存储引擎及其使用方法,以帮助读者更好地理解和应用MySQL中的存储引擎。
一、存储引擎的概念存储引擎是指负责管理数据存储和访问的软件组件,它可以是MySQL默认的InnoDB引擎,也可以是其他第三方开发的引擎,如MyISAM、Memory等。
存储引擎的选择将直接影响到数据库的性能、事务支持、并发控制等方面。
二、常见的存储引擎1. InnoDB引擎InnoDB是MySQL默认的事务型存储引擎,它提供了高并发的事务处理、ACID事务支持、行级锁定等功能。
对于需要频繁进行读写操作和事务处理的应用,使用InnoDB是一个较好的选择。
2. MyISAM引擎MyISAM是MySQL默认的非事务型存储引擎,它提供了快速的插入和查询操作,适用于读多写少的应用场景。
由于不支持事务和行级锁定,MyISAM引擎在并发处理和数据完整性方面相对弱一些。
3. Memory引擎Memory引擎也称为Heap引擎,它将数据存储在内存中,提供了非常快速的数据读写操作。
Memory引擎适用于需要高速读写操作,但对数据持久性要求不高的应用场景。
由于数据存储在内存中,MySQL重启或崩溃时数据将丢失。
4. Archive引擎Archive引擎主要用于存档和长期保存数据,它采用高度压缩的数据存储方式,能够显著减少存储空间的占用。
Archive引擎适用于大量历史数据的存储,对于查询和更新操作的效率相对较低。
5. NDB Cluster引擎NDB Cluster引擎是MySQL集群的核心存储引擎,它提供了高性能的分布式数据库存储和处理能力。
NDB Cluster引擎适用于高可用性和高并发的应用场景,可以实现数据在不同节点间的自动分布和复制。
初识庐山真面目——MySQL数据集简答题1. MySQL数据库可以称得上是目前运行速度最快的SQL语言数据库。
除了具有许多其他数据库所不具备的功能和选择之外,MySQL数据库还是一种完全免费的产品,用户可以直接从网上下载使用,而不必支付任何费用。
MySQL数据库的跨平台性是一个很大的优势。
2. MySQL名称的起源不明。
10多年来,我们的基本目录以及大量库和工具均采用了前缀“my”。
不过,共同创办人Monty Widenius的女儿名字也叫“My”。
时至今日,MySQL 名称的起源仍是一个迷,即使对我们也一样。
MySQL Dolphin(我方徽标)的名称为“Sakila”,它是由MySQL AB公司的创办人从用户在“Dolphin命名”比赛中提供的众多建议中选定的。
该名称是由来自非洲斯威士兰的开放源码软件开发人Ambrose Twebaze提出的。
根据Ambrose的说法,按斯威士兰的本地语言,女性化名称Sakila源自SiSwati。
Sakila也是坦桑尼亚、Arusha地区的一个镇的镇名,靠近Ambrose的母国乌干达。
MySQL从无到有,到技术的不断更新,版本的不断升级,经历了一个漫长的过程,这个过程是实践的过程,是MySQL成长的过程。
时至今日,MySQL的版本已经更新到了mysql-5.6。
下面这个MySQL官方网站上的截图,足可以反应出MySQL的成长历程。
3. MySQL是一个真正的多用户、多线程SQL数据库服务器。
SQL(结构化查询语言)是世界上最流行的和标准化的数据库语言。
下面看一下MySQL的特性:❑使用C和C++编写,并使用了多种编译器进行测试,保证源代码的可移植性。
❑支持AIX、FreeBSD、HP-UX、Linux、Mac OS、Novell Netware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统。
❑为多种编程语言提供了API。
MySQL⾃定义函数和存储过程⽰例详解前⾔本⽂主要给⼤家介绍的是关于MySQL⾃定义函数和存储过程的相关内容,分享出来供⼤家参考学习,下⾯话不多说了,来⼀起看看详细的介绍吧1、前置条件MySQL数据库中存在表user_info,其结构和数据如下:mysql> desc user_info;+-----------+----------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-----------+----------+------+-----+---------+-------+| id | int(10) | NO | PRI | NULL | || name | char(20) | NO | | NULL | || passwd | char(40) | NO | | NULL | || email | char(20) | NO | | NULL | || phone | char(20) | NO | | NULL | || role | char(10) | NO | | NULL | || sex | char(10) | NO | | NULL | || status | int(10) | NO | | NULL | || createAt | datetime | NO | | NULL | || exprAt | datetime | NO | | NULL | || validDays | int(10) | NO | | NULL | || delAt | datetime | YES | | NULL | |+-----------+----------+------+-----+---------+-------+12 rows in set (0.10 sec)mysql> select * from user_info;+----+--------------+----------+------------+-------------+--------+------+--------+---------------------+---------------------+-----------+-------+| id | name | passwd | email | phone | role | sex | status | createAt | exprAt | validDays | delAt |+----+--------------+----------+------------+-------------+--------+------+--------+---------------------+---------------------+-----------+-------+| 1 | StephenWang7 | py123456 | 123@ | 151******** | admin | male | 200 | 2019-04-12 20:11:30 | 2019-04-19 20:11:30 | 30 | NULL || 2 | StephenWang8 | 123456 | 123@ | 151******** | viewer | male | 200 | 2019-04-12 20:11:30 | 2019-04-19 20:11:30 | 30 | NULL |+----+--------------+----------+------------+-------------+--------+------+--------+---------------------+---------------------+-----------+-------+2 rows in set (0.00 sec)2、⾃定义函数函数:可以完成特定功能的⼀段SQL集合。
MySQL中⽂参考⼿册1 MySQL 的⼀般信息这是MySQL参考⼿册;它记载了MySQL版本3.23.7-alpha。
MySQL 是⼀个快速、多线程、多⽤户和强壮的SQL数据库服务器。
对Unix和 OS/2 平台,MySQL基本上是免费的;但对微软平台,你在30 天的试⽤期后必须获得⼀个MySQL 许可证。
详见。
提供有关MySQL的最新信息。
对于MySQL能⼒的讨论,详见。
对于安装指南,见。
对于有关移植MySQL到新机器或操作系统的技巧,参见。
有关从 3.21 版升级的信息,详见。
MySQL的⼊门教程,见。
SQL和基准信息的例⼦,见基准⽬录(在分发中的'sql-bench'⽬录)。
对于新特征和错误修复⼀个历史记录,见。
对于当前已知错误和功能缺陷的⼀张列表,见。
未来计划,见。
这个计划的所有贡献者的名单,见。
重要:将臭⾍(错误)报告、问提和建议发到邮件列表(原⽂未提供)。
对源代码分发,mysqlbug 脚本可在‘scripts’⽬录下找到。
对⼆进制的分发,mysqlbug可在‘bin’⽬录下找到。
如果你有任何关于这本⼿册的增补或修正的任何建议,请将它们发给⼿册⼩组()。
1.1 什么是 MySQL?MySQL是⼀个真正的多⽤户、多线程SQL数据库服务器。
SQL(结构化查询语⾔)是世界上最流⾏的和标准化的数据库语⾔。
MySQL是以⼀个客户机/服务器结构的实现,它由⼀个服务器守护程序mysqld和很多不同的客户程序和库组成。
SQL是⼀种标准化的语⾔,它使得存储、更新和存取信息更容易。
例如,你能⽤SQL语⾔为⼀个⽹站检索产品信息及存储顾客信息,同时MySQL也⾜够快和灵活以允许你存储记录⽂件和图像。
MySQL 主要⽬标是快速、健壮和易⽤。
最初是因为我们需要这样⼀个SQL服务器,它能处理与任何可不昂贵硬件平台上提供数据库的⼚家在⼀个数量级上的⼤型数据库,但速度更快,MySQL就开发出来。
⾃1996年以来,我们⼀直都在使⽤MySQL,其环境有超过 40 个数据库,包含 10,000个表,其中500多个表超过7百万⾏,这⼤约有100 个吉字节(GB)的关键应⽤数据。
MySQL存储引擎特性和线程模型InnoDB 存储引擎核⼼特性MVCC :多版本并发控制聚簇索引:⽤来组织存储数据和优化查询⽀持事务:数据安全保证⽀持⾏级锁:控制并发外键多缓冲区⽀持⾃适应Hash索引: AHI复制中⽀持⾼级特性。
备份恢复:⽀持热备。
⾃动故障恢复:CR Crash Recovery双写机制: Double Write存储引擎管理查询⽀持的、默认使⽤的存储引擎mysql> show engines;+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+| Engine | Support | Comment | Transactions | XA | Savepoints |+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL || MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO || InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES || PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO || MyISAM | YES | MyISAM storage engine | NO | NO | NO || MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO || BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO || CSV | YES | CSV storage engine | NO | NO | NO || ARCHIVE | YES | Archive storage engine | NO | NO | NO |+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+9 rows in set (0.00 sec)mysql> select @@default_storage_engine;+--------------------------+| @@default_storage_engine |+--------------------------+| InnoDB |+--------------------------+1 row in set (0.00 sec)查询某表的存储引擎mysql> show create table test\G;*************************** 1. row ***************************Table: testCreate Table: CREATE TABLE `test` (`id` int(11) NOT NULL AUTO_INCREMENT,`a` int(11) NOT NULL,`b` int(11) DEFAULT NULL,`c` char(10) NOT NULL,`d` varchar(10) DEFAULT NULL,`e` varchar(10) NOT NULL,PRIMARY KEY (`id`),KEY `idx` (`a`,`b`,`c`,`d`,`e`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci1 row in set (0.00 sec)查看所有业务表的存储引擎信息mysql> select table_name,table_schema,engine from information_schema.tables where table_schema not in ('sys','mysql','information_schema','performance_schema');+----------------------+--------------+--------+| TABLE_NAME | TABLE_SCHEMA | ENGINE |+----------------------+--------------+--------+| current_dept_emp | employees | NULL || departments | employees | InnoDB || dept_emp | employees | InnoDB || dept_emp_latest_date | employees | NULL || dept_manager | employees | InnoDB || employees | employees | InnoDB || salaries | employees | InnoDB || t2 | employees | InnoDB || titles | employees | InnoDB || student | school | InnoDB || t100w | test | InnoDB || test | test | InnoDB || city | world | InnoDB || country | world | InnoDB || countryLanguage | world | InnoDB || cours | world | InnoDB || order_info | world | InnoDB || score | world | InnoDB || student | world | InnoDB || t1 | world | InnoDB || t3 | world | InnoDB || t4 | world | InnoDB || t4_log | world | InnoDB || test_json | world | InnoDB || vscc | world | NULL |+----------------------+--------------+--------+25 rows in set (0.00 sec)建表时设置存储引擎mysql> create table xxx (id int) engine=innodb charset=utf8mb4;修改已有表的存储引擎mysql> alter table xxx engine=myisam;mysql> alter table world.xxx engine=innodb;将所有⾮InnoDB存储引擎的表修改为InnoDB1、查出所有⾮InnoDB引擎的表mysql> select table_name,table_schema,engine from information_schema.tables where table_schema not in ('sys','mysql','information_schema','performance_schema') and engine != 'innodb';2、备份⾮InnoDB的表mysql> select concat('mysqldump -uroot -p123456 ',table_schema,'',table_name,' > /backup/',table_schema,'_',table_name,'_',curdate(),'.sql') from information_schema.tables where table_schema not in ('sys','mysql','information_schema3、修改存储引擎mysql> select concat("alter table ",table_schema,".",table_name,"engine=innodb;") from information_schema.tables where table_schema not in ('sys','mysql','information_schema','performance_schema') and engine !='innodb';修复表碎⽚alter table world.xxx engine=innodb;analyze table world.city;InnoDB体系结构---线程详解线程结构-Master ThreadMySQL的master线程在后台执⾏多种I/O相关的任务。
以下文章收集的主题包括:MyISAM和Innodb(及其他)存储引擎的特点、优势、缺点,技术细节差异,这两者的性能表现的比较,各自适合应用于怎样的业务和项目。
Innodb对事务控制的支持(原理),行级锁,具体操作。
检查修复工具myisamchk和mysqlcheck对MyISAM的支持(和对Innodb的部分支持),MyISAM的备份与恢复技巧。
Innodb数据文件ibdata*和日志文件ib_logfile*。
Innodb的Per-Table表空间。
MySQL数据表在系统中表现形式有:ISAM、MyISAM、MERGE、BDB、InnoDB和HEAP。
每种数据表在文件系统中都有不同的表示方式,有一个共同点就是每种数据表至少有一个存放数据表结构定义的.frm文件。
ISAM数据表是最原始的数据表(.frm,.ISD,.ISM),MyISAM数据表是ISAM数据表的继承者。
InnoDB 由于采用表空间的概念来管理数据表,所以它只有一个与数据表对应.frm文件,同一目录下的其它文件表示为表空间,存储数据表的数据和索引。
数据目录是用来存放数据表和相关信息的地方,是数据库的核心。
在WINDOWS系统上,数据目录的位置默认是在c:/mysql/data中。
数据目录除存放数据库文件外,还会存放日志文件,状态文件,配置文件,DES密钥文件或服务器的SSL证书与密钥文件等。
在MySQL中,每个数据库其实就是在数据目录下一个子目录,show databases命令相当于列出数据目录中的目录清单。
所以可以通过操作数据目录中的子目录来新建(create)、删除(drop)数据库。
但drop database db_name命令不能删除db_name目录中创建的其它非数据表文件;且由于InnoDB是表空间来管理数据表,所以不能用rm或del命令删除InnoDB的数据表。
参照:mysql学习笔记第三章:D:\superFile\Documents\A-学习编程\数据库\mysql\完整教程_mysql 学习笔记.docMySQL Storage Engine 小记这段时间在看《High Performance MySQL》,看到存储引擎这个地方感到很多细节比较陌生,所以总结小记一些。
第16章:编写自定义存储引擎目录16.1. 前言16.2. 概述16.3. 创建存储引擎源文件16.4. 创建handlerton16.5. 对处理程序进行实例化处理16.6. 定义表扩展16.7. 创建表16.8. 打开表16.9. 实施基本的表扫描功能16.9.1. 实施store_lock()函数16.9.2. 实施external_lock()函数16.9.3. 实施rnd_init()函数16.9.4. 实施info()函数16.9.5. 实施extra()函数16.9.6. 实施rnd_next()函数16.10. 关闭表16.11. 为存储引擎添加对INSERT的支持16.12. 为存储引擎添加对UPDATE的支持16.13. 为存储引擎添加对DELETE的支持16.14. API引用16.14.1. bas_ext16.14.2. close16.14.3. create16.14.4. delete_row16.14.5. delete_table16.14.6. external_lock16.14.7. extra16.14.8. info16.14.9. open16.14.10. rnd_init16.14.11. rnd_next16.14.12. store_lock16.14.13. update_row16.14.14. write_row16.1. 前言对于MySQL 5.1,MySQLAB公司引入了插件式存储引擎体系结构,这样,就能创建新的存储引擎,并将它们添加到正在运行的MySQL服务器上,而不必重新编译服务器本身。
该体系结构简化了新存储引擎的开发和部署。
本章的意图是作为指南,用于帮助你为新的插件式存储引擎体系结构开发存储引擎。
关于MySQL插件式存储引擎体系结构的更多信息,请参见第14章:插件式存储引擎体系结构。
16.2. 概述MySQL服务器采用了模块化风格。
MySQL之存储引擎存储引擎的概念是MySQL的一个特性,可简单理解为表类型;每一个表都有一个存储引擎,可在创建时指定,也可之后使用ALTER TABLE语句修改,都是通过ENGINE关键字设置的;若创建时没有指定,则为默认存储引擎,默认存储引擎也可通过参数文件中default-table-type参数修改。
----查看当前默认存储引擎,默认为MyISAMmysql> show variables like 'table_type';----查看当前数据库支持的存储引擎mysql> show engines \G;从输出结果可看到支持多个存储引擎,下面介绍几个重要的存储引擎如下:MyISAM默认存储引擎,不支持事务、外键,但访问速度快,对事务完整性不要求,适合于以SELECT/INSERT 为主的表;每个MyISAM物理上存储为3个文件,文件名与表名相同,扩展名分别为:.frm(存储表定义)、MYD(MYData存储数据)、MYI(MYIndex存储索引),其中数据文件和索引文件可以放置在不同目录,平衡I/O。
数据文件和索引文件的路径,需要在创建表时通过DATA DIRECTORY和INDEX DIRECTORY语句指定,需要绝对路径,且具有访问权限。
MySQL类型的表可能因各种原因损坏,可通过CHECK TABLE语句检查表的健康,使用REPAIR TABLE 语句修改。
MySQL类型的表支持3中不同的存储格式,如下:静态表:默认存储格式,字段长度固定,存储迅速,容易缓存,缺点是占用空间多。
注意:字段存储按照宽度定义补足空格,应用访问时去掉空格,若字段本身就带有空格,也会去掉,这点特别注意。
动态表:变长字段,记录不是固定长度,优点是占用空间少,但频繁的更新删除操作会产生碎片,需要定期执行OPTIMIZE TABLE语句或myisamchk –r命令来改善,出现故障时难以恢复。
MySQL必知存储引擎Mysql存储引擎1.MyISAM MySQL 5.0 之前的默认数据库引擎,最为常用。
拥有较高的插入,查询速度,但不支持事务.2.InnoDB事务型数据库的首选引擎,支持ACID事务,支持行级锁定, MySQL 5.5 起成为默认数据库引擎.3.BDB源自Berkeley DB,事务型数据库的另一种选择,支持Commit 和Rollback 等其他事务特性4.Memory所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。
但是会占用和数据量成正比的内存空间。
并且其内容会在 MySQL 重新启动时丢失5.Merge将一定数量的 MyISAM 表联合而成一个整体,在超大规模数据存储时很有用6.Archive非常适合存储大量的独立的,作为历史记录的数据。
因为它们不经常被读取。
Archive 拥有高效的插入速度,但其对查询的支持相对较差7.Federated将不同的 MySQL 服务器联合起来,逻辑上组成一个完整的数据库。
非常适合分布式应用8.Cluster/NDB高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。
适合数据量大,安全和性能要求高的应用9.CSV 逻辑上由逗号分割数据的存储引擎。
它会在数据库子目录里为每个数据表创建一个 .csv 文件。
这是一种普通文本文件,每个数据行占用一个文本行。
CSV 存储引擎不支持索引。
10.BlackHole 黑洞引擎,写入的任何数据都会消失,一般用于记录 binlog 做复制的中继11.EXAMPLE 存储引擎是一个不做任何事情的存根引擎。
它的目的是作为MySQL 源代码中的一个例子,用来演示如何开始编写一个新存储引擎。
同样,它的主要兴趣是对开发者。
EXAMPLE 存储引擎不支持编索引。
另外,MySQL 的存储引擎接口定义良好。
有兴趣的开发者可以通过阅读文档编写自己的存储引擎。
InnoDBInnoDB是MySQL默认的事务型存储引擎,只有在需要他不支持的特性时,才考虑使用期它存储引擎。
MyISAM存储引擎每张表在磁盘上的存储分为三个文件:存放元数据的.frm文件,存放表记录数据的.MYD 文件,存放索引数据的.MYI为索引文件。
MyISAM的一些特点·只对索引进行缓存(Key Cache),数据文件使用操作系统cache,当索引数据大于分配的key buffer时也使用操作系统cache索引·单独保存表的行数,因此做count(*)时不需要全表扫描·不是事务安全的,不支持外键·表级锁定·每张表一个数据文件,备份时可以直接复制,恢复时也可以直接覆盖,操作方便·使用myisamchk进行故障恢复MyISAM启动MyISAM表的存储格式MyISAM支持三种不同的存储格式:静态固定长度、动态可变长度和压缩格式。
前两者根据列的数据类型自动选择。
压缩格式只能通过myisampack工具创建。
当使用CREATE TABLE或ALTER TABLE操作不包含BLOB、TEXT列时,ROW_FORMAT选项强制设置存储格式(FIXED、DYNAMIC)。
静态固定长度:·CHAR和VARCHAR自动用空格填充,BINARY和VARBINARY以0x00填充。
·快速,因为数据文件中的行可以用简单的方法找到:用行长度乘以行号。
·容易缓存·崩溃后容易重建,因为行的位置固定。
·不需要重新组织,除非删除了大量的记录,想为操作系统腾出磁盘空间。
可以使用OPTIMIZE TABLE或myisamchk -r完成。
·通常比动态格式花费更多的空间。
动态可变长度:·字符型的列长度可变,除了长度小于4的·每行首部存在一个位图,用于记录哪些列包含空字符串(对于字符型)或0(对于数字型)。
注意这里不包括NULL。
空串和0为被标记在位图中而不存储在磁盘。
非空字符串保存它的长度和实际内容(即保存实际长度+1)。
存储引擎介绍⼀. 存储引擎介绍1. 什么是存储引擎存储引擎就是表的类型, 针对不同类型的表, mysql使⽤不同的存取机制Copy现实⽣活中我们⽤来存储数据的⽂件有不同的类型,每种⽂件类型对应各⾃不同的处理机制:⽐如处理⽂本⽤txt类型,处理表格⽤excel,处理图⽚⽤png等数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型⼜称为存储引擎。
存储引擎说⽩了就是如何存储数据、如何为存储的数据建⽴索引和如何更新、查询数据等技术的实现⽅法。
因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)拓展:Copy在Oracle 和SQL Server等数据库中只有⼀种存储引擎,所有数据存储管理机制都是⼀样的。
⽽MySql数据库提供了多种存储引擎。
⽤户可以根据不同的需求为数据表选择不同的存储引擎,⽤户也可以根据⾃⼰的需要编写⾃⼰的存储引擎SQL 解析器、SQL 优化器、缓冲池、存储引擎等组件在每个数据库中都存在,但不是每个数据库都有这么多存储引擎。
MySQL 的插件式存储引擎可以让存储引擎层的开发⼈员设计他们希望的存2. MySQL四种主要存储引擎介绍Copy# InnoDB'''使⽤版本: MySQL5.5版本及之后默认的存储引擎优点: ⽀持事务, ⾏级锁定和外键约束对数据的安全性较半个缺点: 访问速度没有MyISAM快, 但是我们更加注重的是数据的安全.每个InnoDB在磁盘上存储成2个⽂件,其中⽂件名和表名都相同,但是扩展名分别为:.frm(存储表结构).idb(i -> index. 索引+数据组织表)'''# MyISAM'''使⽤版本: MySQL5.5版本之前默认的存储引擎优点: 访问速度要⽐Innodb更快缺点: 不⽀持事务,也不⽀持外键, 对事务完整性没有要求, 数据的安全性没有Innodb⾼.每个MyISAM在磁盘上存储成3个⽂件,其中⽂件名和表名都相同,但是扩展名分别为:.frm(存储表结构).MYD(MyData,存储数据).MYI(MyIndex,存储索引)'''# MEMORY'''优点: 采⽤内存存储, 访问数据可以得到最快的响应.缺点: 断电数据丢失. 或当mysqld守护进程崩溃时,所有的Memory数据也会丢失.每个MEMORY在磁盘上存储成1个⽂件,其中⽂件名和表名都相同,但是扩展名分别为:.frm(存储表结构)'''# BLACKHOLE'''特点: ⽆论存什么,都⽴刻消失(⿊洞). 类似于回收站每个BLACKHOLE在磁盘上存储成1个⽂件,其中⽂件名和表名都相同,但是扩展名分别为:.frm(存储表结构)'''# MyISAM与InnoDB两个引擎的区别:'''<1> InnoDB⽀持事务,MyISAM 不⽀持,这⼀点是⾮常之重要。
MySQL中的数据类型扩展和自定义方法MySQL是一个流行的开源关系型数据库管理系统,广泛应用于各个领域的数据存储和处理。
在MySQL中,数据类型是非常重要的一部分,它决定了数据的存储方式和可操作性。
除了内置的数据类型,MySQL还支持数据类型扩展和自定义方法,这为开发人员提供了更多的灵活性和扩展性。
一、数据类型扩展MySQL的内置数据类型包括整型、浮点型、字符型、日期型等,这些数据类型可以满足大部分的数据存储需求。
然而,有时候我们可能需要存储一些特殊的数据,这时就需要对数据类型进行扩展。
1. 扩展整型:除了MySQL内置的整型数据类型(TINYINT、SMALLINT、INT、BIGINT),MySQL还提供了UNSIGNED和ZEROFILL等修饰符。
UNSIGNED修饰符表示整数只能为正数,ZEROFILL修饰符则表示在显示数据时,数字不够位数会自动补0。
2. 扩展浮点型:MySQL提供了FLOAT和DOUBLE等浮点型数据类型,它们可以表示小数。
如果需要更高的精度,可以使用DECIMAL数据类型。
此外,还可以使用PRECISION和SCALE两个参数来限定DECIMAL的精度和小数位数。
3. 扩展字符型:MySQL的字符型数据类型包括CHAR和VARCHAR,它们可以存储不同长度的字符串。
如果需要存储更大的文本内容,可以使用TEXT和BLOB数据类型。
此外,MySQL还支持枚举类型和集合类型,它们可以用来存储一组固定的字符串值。
4. 扩展日期型:MySQL内置的日期和时间类型包括DATE、DATETIME、TIME和TIMESTAMP。
如果需要存储更高的时间精度,可以使用微秒级别的TIME(6)和DATETIME(6)数据类型。
二、自定义方法除了扩展数据类型,MySQL还支持用户自定义方法,开发人员可以根据自己的需求编写自定义函数和存储过程。
1. 自定义函数:MySQL允许用户使用SQL语句来创建自定义函数,以实现某些特定的功能。
Skip navigation linksThe world's most popular open source databaseLogin | Register∙Developer Zone∙Downloads∙Documentation∙MySQL Server∙MySQL Enterprise∙MySQL Workbench∙MySQL Cluster∙Topic Guides∙Expert Guides∙Other Docs∙Archives∙About∙Documentation Libraryo Table of ContentsSearch manual:第1章:一般信息目录1.1. 关于本手册1.2. 本手册采用的惯例1.3. MySQL AB概述1.4. MySQL数据库管理系统概述1.4.1. MySQL的历史1.4.2. MySQL的的主要特性1.4.3. MySQL稳定性1.4.4. MySQL表最大能达到多少1.4.5. 2000年兼容性1.5. MaxDB数据库管理系统概述1.5.1. 什么是MaxDB?1.5.2. MaxDB的历史1.5.3. MaxDB的特性1.5.4. 许可和支持1.5.5. MaxDB和MySQL之间的特性差异1.5.6. MaxDB和MySQL之间的协同性1.5.7. 与MaxDB有关的链接1.6. MySQL发展大事记1.6.1. MySQL 5.1的新特性1.7. MySQL信息源1.7.1. MySQL邮件列表1.7.2. IRC(在线聊天系统)上的MySQL社区支持1.7.3. MySQL论坛上的MySQL社区支持1.8. MySQL标准的兼容性1.8.1. MySQL遵从的标准是什么1.8.2. 选择SQL模式1.8.3. 在ANSI模式下运行MySQL1.8.4. MySQL对标准SQL的扩展1.8.5. MySQL与标准SQL的差别1.8.6. MySQL处理约束的方式MySQL®软件提供了十分快速的多线程、多用户、牢靠的SQL(结构化查询语言)数据库服务器。
在MySQL中使用自定义存储引擎进行数据存储MySQL是当下最受欢迎的开源关系型数据库管理系统之一,它为开发者提供了丰富的功能和灵活的存储引擎选择。
其中,存储引擎是MySQL的核心组件之一,它负责将数据存储在磁盘上,并提供数据的读写能力。
MySQL默认提供了InnoDB、MyISAM等多个存储引擎,但有时候,默认引擎并不能完全满足我们的需求,这时就需要使用自定义存储引擎。
什么是存储引擎?存储引擎是MySQL存储和检索数据的组件,它定义了数据如何存储在磁盘上,以及如何读取和写入数据。
MySQL的存储引擎可以分为两类,一类是原生存储引擎,另一类是第三方存储引擎。
原生存储引擎是MySQL官方提供的,包括InnoDB、MyISAM等;而第三方存储引擎则是由开发者提供的,如TokuDB、Percona XtraDB等。
为什么要使用自定义存储引擎?MySQL的默认存储引擎InnoDB具有ACID事务支持和行级锁等强大功能,因此在大多数情况下都能够满足我们的需求。
但有时候,我们可能需要更好的性能、更高的稳定性或者更灵活的特性,这时候自定义存储引擎就派上用场了。
自定义存储引擎可以根据我们的具体需求进行优化和扩展,从而提供更好的性能和特性。
例如,我们可以根据应用程序的读写特点,设计更高效的索引结构、数据压缩算法和缓存策略;或者实现一些特殊的存储需求,如空间数据存储、图形数据存储等。
通过自定义存储引擎,我们可以更好地适应应用程序的需求,提升数据库的性能和扩展性。
自定义存储引擎的实现方式有多种,其中最常见的是使用MySQL提供的API接口进行开发。
MySQL提供了一系列的API接口,如存储引擎接口、索引接口、事务接口等,开发者可以根据自己的需求选择适合的接口进行开发。
在开发过程中,我们需要了解MySQL的存储引擎架构和内部机制,熟悉API接口的使用方法,以及掌握一些基本的数据结构和算法知识。
自定义存储引擎的开发过程一般包括以下几个步骤:设计、开发、调试和优化。
第16章:编写自定义存储引擎目录16.1. 前言16.2. 概述16.3. 创建存储引擎源文件16.4. 创建handlerton16.5. 对处理程序进行实例化处理16.6. 定义表扩展16.7. 创建表16.8. 打开表16.9. 实施基本的表扫描功能16.9.1. 实施store_lock()函数16.9.2. 实施external_lock()函数16.9.3. 实施rnd_init()函数16.9.4. 实施info()函数16.9.5. 实施extra()函数16.9.6. 实施rnd_next()函数16.10. 关闭表16.11. 为存储引擎添加对INSERT的支持16.12. 为存储引擎添加对UPDATE的支持16.13. 为存储引擎添加对DELETE的支持16.14. API引用16.14.1. bas_ext16.14.2. close16.14.3. create16.14.4. delete_row16.14.5. delete_table16.14.6. external_lock16.14.7. extra16.14.8. info16.14.9. open16.14.10. rnd_init16.14.11. rnd_next16.14.12. store_lock16.14.13. update_row16.14.14. write_row16.1. 前言对于MySQL 5.1,MySQLAB公司引入了插件式存储引擎体系结构,这样,就能创建新的存储引擎,并将它们添加到正在运行的MySQL服务器上,而不必重新编译服务器本身。
该体系结构简化了新存储引擎的开发和部署。
本章的意图是作为指南,用于帮助你为新的插件式存储引擎体系结构开发存储引擎。
关于MySQL插件式存储引擎体系结构的更多信息,请参见第14章:插件式存储引擎体系结构。
16.2. 概述MySQL服务器采用了模块化风格。
图16.1:MySQL体系结构存储引擎负责管理数据存储,以及MySQL的索引管理。
通过定义的API,MySQL服务器能够与存储引擎进行通信。
每个存储引擎均是1个继承类,每个类实例作为处理程序而被引用。
针对需要与特殊表一起工作的每个线程,处理程序是在1个处理程序的基础上实例化的。
例如,如果3个连接全都在相同的表上工作,需要创建3个处理程序实例。
一旦创建了处理程序实例,MySQL服务器将向处理程序发送命令,以便执行数据存储和检索任务,如打开表、操纵行和管理索引等。
能够以累进方式创建定制存储引擎:开发人员能够以只读存储引擎启动,随后添加对INSERT、UPDATE和DELETE操作的支持,甚至能够增加对索引功能、事务和其他高级操作的支持。
16.3. 创建存储引擎源文件实施新存储引擎的最简单方法是,通过拷贝和更改EXAMPLE存储引擎开始。
在MySQL5.1源码树的sql/examples/目录下可找到文件ha_和ha_example.h。
关于如何获得5.1源码树的说明,请参见2.8.3节,“从开发源码树安装”。
复制文件时,将名称从ha_和ha_example.h更改为与存储引擎相适应的名称,如ha_和ha_foo.h。
拷贝并重命名了这些文件后,必须更换所有的EXAMPLE示例,以及具有存储引擎名称的示例。
如果你熟悉sed,也能自动完成这些步骤:sed s/EXAMPLE/FOO/g ha_example.h | sed s/example/foo/g ha_foo.hsed s/EXAMPLE/FOO/gha_ | sed s/example/foo/g ha_16.4. 创建handlertonhandlerton(“单个处理程序”的简称)定义了存储引擎,并包含指向函数的函数指针,它以整体方式作用在引擎上,而函数工作在单独的处理程序实例中。
在这类函数的一些示例中,包含用于处理注释和回滚的事务函数。
下面给出了一个来自EXAMPLE存储引擎的示例:handlerton example_hton= { "EXAMPLE", SHOW_OPTION_YES, "Example storage engine", DB_TYPE_EXAMPLE_DB, NULL, /* Initialize */ 0, /* slot */ 0, /* savepoint size. */ NULL, /* close_connection */ NULL, /* savepoint */ NULL, /* rollback to savepoint */ NULL, /* release savepoint */ NULL, /* commit*/ NULL, /* rollback */ NULL, /* prepare */ NULL, /* recover */ NULL, /* commit_by_xid */ NULL, /* rollback_by_xid */ NULL, /* create_cursor_read_view */ NULL, /* set_cursor_read_view */ NULL, /* close_cursor_read_view */ example_create_handler, /* Create a new handler */ NULL, /* Drop a database */ NULL, /* Panic call */ NULL, /* Release temporary latches */ NULL, /* Update Statistics */ NULL, /* Start Consistent Snapshot */ NULL, /* Flush logs */ NULL, /* Show status */ NULL, /* Replication Report Sent Binlog */ HTON_CAN_RECREATE};下面给出了来自handler.h的handlerton定义:typedef struct { const char *name; SHOW_COMP_OPTION state; const char*comment; enum db_type db_type; bool (*init)(); uint slot; uint savepoint_offset; int (*close_connection)(THD *thd); int (*savepoint_set)(THD *thd, void *sv); int (*savepoint_rollback)(THD *thd, void*sv); int (*savepoint_release)(THD *thd, void *sv); int (*commit)(THD *thd,bool all); int (*rollback)(THD *thd, bool all); int (*prepare)(THD *thd, bool all); int (*recover)(XID *xid_list, uint len); int (*commit_by_xid)(XID *xid); int (*rollback_by_xid)(XID *xid); void*(*create_cursor_read_view)(); void (*set_cursor_read_view)(void *); void (*close_cursor_read_view)(void *); handler *(*create)(TABLE *table); void (*drop_database)(char* path); int (*panic)(enum ha_panic_function flag); int (*release_temporary_latches)(THD *thd); int (*update_statistics)(); int (*start_consistent_snapshot)(THD *thd); bool (*flush_logs)(); bool (*show_status)(THD *thd, stat_print_fn *print, enum ha_stat_type stat); int (*repl_report_sent_binlog)(THD *thd, char *log_file_name, my_off_t end_offset); uint32 flags; } handlerton; 共有30个handlerton元素,但只有少量元素是强制性的(明确地讲是前4个元素和第21个元素)。
1. 存储引擎的名称。
这是创建表时将使用的名称(CREATE TABLE ... ENGINE = FOO;)。
2. 确定使用SHOW STORAGE ENGINES命令时是否列出存储引擎。
3. 存储引擎注释,对使用SHOW STORAGE ENGINES命令时显示的存储引擎的描述。
4. 在MySQL服务器内唯一识别存储引擎的整数。
内置存储引擎使用的常数定义在handler.h文件中。
作为创建常数的可选方法,可使用大于25的整数。
5. 指向存储引擎初始化程序的指针。
仅当启动服务器时才调用该函数,以便在实例化处理程序之前,存储引擎类能执行必要的内务操作。
6.插槽。
保存每连接的信息时,每个存储引擎在thd中有自己的内存区域(实际上为指针)。
它是作为thd->ha_data[foo_hton.slot]访问的。
插槽编号在调用foo_init()后由MySQL初始化。
7. 保存点偏移。
为了保存每个savepoint数据,为存储引擎提供了请求的大小(典型情况下为0)。
必须以静态方式初始化savepoint偏移,使其具有所有的内存大小,以便保存每个savepoint的信息。
在foo_init之后,它被更改为savepoint存储区域的偏移,存储引擎不需要使用它。
8. 由事务性存储引擎使用,清理其存储段内分配的内存,和/或回滚任何未完成的事务。
9. 由事务性存储引擎选择性使用,创建savepoint(保存点),并将其保存到提供的内存中。
10.指向处理程序rollback_to_savepoint()函数的函数指针。
它用于在事务期间返回savepoint。
仅对支持保存点的存储引擎才会填充它。
11.指向处理程序release_savepoint()函数的函数指针。