MySQL 5.7分支新增空间索引功能

2020-02-07 04:34栏目:龙电竞官网
TAG:

在最新发布的MySQL 5.7.4实验室版本中,InnoDB存储引擎新增了对于几何数据空间索引的支持。在此之前,InnoDB将几何数据存储为BLOB数据,在空间数据上只能创建前缀索引,当涉及空间搜索时非常低效,尤其是在涉及复杂的几何数据时。在大多数情况下,获得结果的唯一方式是扫描表。新版本MySQL中,InnoDB支持空间索引,通过R树来实现,使得空间搜索变得高效。InnoDB空间索引也支持MyISAM引擎现有的空间索引的语法,此外,InnoDB空间索引支持完整的事务特性以及隔离级别。目前,InnoDB空间索引只支持两个维度的数据,MySQL开发团队表示有计划支持多维。此外,开发团队正在做更多关于性能方面的工作,以使其更加高效。关于MySQL空间索引更多信息,可参考这个关于MySQL在GIS方面应用的示例。MySQL 5.7.4实验室版本下载:MySQL 5.7 labs

前言

1、MySQL默认存储引擎的变迁

关于存储引擎的细节,请参考官方文档。如果使用InnoDB引擎,建议阅读官方手册中的InnoDB事务模型和锁一节。

在MySQL 5.1之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB。

数据库和表

2、MyISAM与InnoDB存储引擎的主要特点

在文件系统中,MySQL将每个数据库(schema)保存为数据目录下的一个子目录。创建表时,MySQL会在数据库子目录下创建一个和表同名的.frm文件,用于保存表的定义。因为MySQL使用文件系统的目录保存数据库和表的定义,大小写敏感性和具体的平台相关。在Windows中,大小写是不敏感的,而在类UNIX中则是敏感的。不同的存储引擎保存数据和索引的方式是不同的,但表的定义则是在MySQL服务层统一处理的。可以使用SHOW TABLE STATUS命令显示表的相关信息。

MyISAM存储引擎的特点是:表级锁、不支持事务和全文索引,适合一些CMS内容管理系统作为后台数据库使用,但是使用大并发、重负荷生产系统上,表锁结构的特性就显得力不从心;

 

以下是MySQL 5.7 MyISAM存储引擎的版本特性:

图片 1

InnoDB存储引擎的特点是:行级锁、事务安全、支持外键、不支持FULLTEXT类型的索引(5.6.4以后版本开始支持FULLTEXT类型的索引)。InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全存储引擎。InnoDB是为处理巨大量时拥有最大性能而设计的。它的CPU效率可能是任何其他基于磁盘的关系数据库引擎所不能匹敌的。

 

以下是MySQL 5.7 InnoDB存储引擎的版本特性:

通过Engine字段可以看出mysql.user表,是一个MyISAM表,表中一些字段含义:

注意:

Name

InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “a%”

表名。

两种类型最主要的差别就是InnoDB支持事务处理与外键和行级锁。而MyISAM不支持。所以MyISAM往往就容易被人认为只适合在小项目中使用。

Engine

3、MyISAM与InnoDB性能测试

表的存储引擎类型。

下边两张图是官方提供的MyISAM与InnoDB的压力测试结果

Row_format

可以看出,随着CPU核数的增加,InnoDB的吞吐量反而越好,而MyISAM,其吞吐量几乎没有什么变化,显然,MyISAM的表锁定机制降低了读和写的吞吐量。

行的格式。对于MyISAM表,可选的值为Dynamic/Fixed/Compressed。其中:

4、事务支持与否

Dynamic的行长度是可变的,一般包含可变长度的字段,如,VARCHAR或BLOB。 Fixed的行长度则是固定的,只包含固定长度的列,如,CHAR和INTEGER。 Compressed的行则只在压缩表中存在。

MyISAM是一种非事务性的引擎,使得MyISAM引擎的MySQL可以提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用;

Rows

InnoDB是事务安全的;

表中的行数。对于MyISAM和其他一些存储引擎,该值是精确的,但对于InnoDB该值是估计值。

事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。

Avg_row_length

5、MyISAM与InnoDB构成上的区别

平均每行包含的字节数。

每个MyISAM在磁盘上存储成三个文件:

Data_length

第一个文件的名字以表的名字开始,扩展名指出文件类型,.frm文件存储表定义。 第二个文件是数据文件,其扩展名为.MYD (MYData)。 第三个文件是索引文件,其扩展名是.MYI (MYIndex)。

表数据的大小,以字节为单位。

基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的 大小只受限于操作系统文件的大小,一般为 2GB。

Max_data_length

6、MyISAM与InnoDB表锁和行锁的解释

表数据的最大容量,该值和存储引擎有关。

MySQL表级锁有两种模式:表共享读锁和表独占写锁。什么意思呢,就是说对MyISAM表进行读操作时,它不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写操作;而对MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作。

Index_length

InnoDB行锁是通过给索引项加锁来实现的,即只有通过索引条件检索数据,InnoDB才使用行级锁,否则将使用表锁!行级锁在每次获取锁和释放锁的操作需要消耗比表锁更多的资源。在InnoDB两个事务发生死锁的时候,会计算出每个事务影响的行数,然后回滚行数少的那个事务。当锁定的场景中不涉及Innodb的时候,InnoDB是检测不到的。只能依靠锁定超时来解决。

索引的大小,以字节为单位。

7、是否保存数据库表中表的具体行数

Data_free

InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。

对于MyISAM表,表示已分配但目前没有使用的空间。这部分空间包括之前删除的行,以及后续可以被INSERT利用到的空间。

注意的是,当count(*)语句包含where条件时,两种表的操作是一样的。也就是 上述“6”中介绍到的InnoDB使用表锁的一种情况。

Auto_increment

8、如何选择

下一个AUTO_INCREMENT的值。

MyISAM适合:

Create_time

做很多count 的计算; 插入不频繁,查询非常频繁,如果执行大量的SELECT,MyISAM是更好的选择; 没有事务。

表的创建时间。

InnoDB适合:

版权声明:本文由龙竞技官网发布于龙电竞官网,转载请注明出处:MySQL 5.7分支新增空间索引功能