1、先来了解下MySQL
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。
MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
2、MySQL常见的存储引擎及其它们之间的区别
首先要知道MySQL中有两种类型的存储引擎:事务性和非事务性。
存储引擎 | 特点 |
---|---|
InnoDB | 提供了事务安全(ACID兼容)表,支持外键引用完整性约束。它支持提交、回滚和紧急恢复功能来保护数据。它还支持行级锁定。当在多用户环境中使用时,它的“一致非锁定读取”提高了性能。它将数据存储在集群索引中,从而减少了基于主键的查询的I/O。 |
MyISAM | 该存储引擎的特点就是查询速度快、存储空间小,原因是在磁盘上分成三个文件存储:.frm(存储表定义),.MYD(MYData,存储数据),.MYI(MYIndex,存储索引),SELECT COUNT(*) FROM TABLE时,避免了全表扫描。但是MyISAM不支持事务,也不支持外键,写入时是表锁,所以适合查询多、写入少的业务场景。 |
Mermory | Memory表至少比MyISAM表要快一个数量级,因为所有的数据都保存在内存中,不需要进行磁盘I/O。Memory表的结构在重启以后还会保留,但数据会丢失。 |
Archive | Archive是归档的意思,在归档之后很多的高级功能就不再支持了,仅仅支持最基本的插入和查询两种功能。在MySQL 5.5版以前,Archive是不支持索引,但是在MySQL 5.5以后的版本中就开始支持索引了。Archive拥有很好的压缩机制,它使用zlib压缩库,在记录被请求时会实时压缩,所以它经常被用来当做仓库使用。比如:由于高压缩和快速插入的特点Archive非常适合作为日志表的存储引擎,但是前提是不经常对该表进行查询操作。 |
3、MySQL索引
索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间。可以说索引优化应该是对查询性能优化最有效的手段,创建一个真正最优的索引经常需要重写SQL查询语句。
但这并不代表索引越多越好;下面就来说说MySQL中索引的优缺点:
优点:
我们大家都知道,索引可以让MySQL快速地查找到我们所需要的数据,但这并不是索引的唯一作用。
最常见的B-Tree索引,按照顺序存储数据,所以,MySQL可以用来做Order By和Group By操作。因为数据是有序存储的,B-Tree也就会把相关的列值都存储在一起。最后,因为索引中也存储了实际的列值,所以某些查询只使用索引就能够获取到全部的数据,无需再回表查询。据此特性,总结出索引有如下三个优点:
a)、索引大大减少了MySQL服务器需要扫描的数据量,加快查询速度。
b)、索引可以把随机I/O变为顺序I/O。
c)、索引可以帮助服务器避免排序和临时表。
索引并不总是最好的工具,也不是说索引越多越好。总的来说,只要当索引帮助存储引擎快速找到记录带来的好处大于其带来的额外工作时,索引才是有用的。
对于非常小的表,大部分情况下简单的全表扫描更高效,没有必要再建立索引。对于中到大型的表,索引带来的好处就非常明显了。
缺点:
a)、创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
b)、索引也需要占空间,我们知道数据表中的数据也会有最大上线设置的,如果我们有大量的索引,索引文件可能会比数据文件更快达到上线值。
c)、当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。
那么综合MySQL索引的优缺点不难得出:并不是每个字段度设置索引就好,也不是索引越多越好,而是需要自己合理的使用。下面总结下索引的使用原则及其需要注意的事项:
- 对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引;
- 数据量小的表最好不要使用索引,因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果;
- 在不同值少的字段上不要建立索引,比如用户表中的"性别"字段上只有男,女两个不同值。相反的,在不同值较多的字段上可以建立索引;
- 数据类型越小越好。数据类型越小,在磁盘、内存和CPU缓存中需要的空间更少,处理速度更快;
- 数据类型越简单越好。整形优于字符串,内置日期和时间优于字符串;
- 尽量避免NULL;
- 复合索引将最常用作限制条件的列放在最左边,依次递减;
- 复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的;
- 短索引。对串列进行索引,如果可能应该指定一个前缀长度,不仅可以提高查询速度而且可以节省磁盘空间和I/O操作;
- mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
- 使用NOT IN和!=操作,mysql将无法使用索引。
- 不要在列上进行运算,where字句的查询条件里使用了函数将不会使用索引。
接着就让我们来看看MySQL中索引的类型都有哪些:
-
常规索引
常规索引,也叫普通索引(index或key),它可以常规地提高查询效率。一张数据表中可以有多个常规索引。常规索引是使用最普遍的索引类型,如果没有明确指明索引的类型,我们所说的索引都是指常规索引。 -
主键索引
主键索引(Primary Key),也简称主键。它可以提高查询效率,并提供唯一性约束。一张表中只能有一个主键。被标志为自动增长的字段一定是主键,但主键不一定是自动增长。一般把主键定义在无意义的字段上(如:ID),主键的数据类型最好是数值。 -
唯一索引
唯一索引(Unique Key),可以提高查询效率,并提供唯一性约束。一张表中可以有多个唯一索引。(允许存在空值(只允许存在一条空值)) -
组合索引
指在表的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用
这里解释下最左前缀:
组合索引就是遵从了最左前缀,利用索引中最左边的列集来匹配行,这样的列集称为最左前缀;举个简单的例子来说明下吧:比如我们创建(id,name,birth)这样的一个组合索引,那么相当于对id列进行排序,也就是我们创建组合索引,以最左边的为准,只要查询条件中带有最左边的列,那么查询就会使用到索引
- 全文索引
全文索引(Full Text),可以提高全文搜索的查询效率,一般使用Sphinx替代。但Sphinx不支持中文检索,Coreseek是支持中文的全文检索引擎,也称作具有中文分词功能的Sphinx。实际项目中,我们用到的是Coreseek。
注意⚠️:
1、5.6版本之后InnoDB存储引擎开始支持全文索引,5.7版本之后通过使用ngram插件开始支持中文。
2、目前只有char、varchar,text列上可以创建全文索引。
3、 like “value%” 可以使用索引,但是对于 like “%value%” 这样的方式,执行全表查询
- 外键索引
外键索引(Foreign Key),简称外键,它可以提高查询效率,外键会自动和对应的其他表的主键关联。外键的主要作用是保证记录的一致性和完整性。
注意⚠️:只有InnoDB存储引擎的表才支持外键。外键字段如果没有指定索引名称,会自动生成。如果要删除父表(如分类表)中的记录,必须先删除子表(带外键的表)中的相应记录,否则会出错。 创建表的时候,可以给字段设置外键,如 foreign key(cate_id) references cms_cate(id),由于外键的效率并不是很好,因此并不推荐使用外键,但我们要使用外键的思想来保证数据的一致性和完整性。
未完待续。。。
转载:https://blog.csdn.net/qq_37868757/article/details/105631028