4、mysql高级特性
1.分区表:
概念:
底层用多个物理子表组成。对于应用层来说可以不做变化,我们无需改变原有的SQL语句
建表时使用PARTITION BY定义每个分区存放的数据
原理:
打开并锁住所有的底层表,优化器判断可过滤的分区,继而进行增删改查
适用场景:
1.表很大无法全部放到内存中(查询的时候过滤掉一些分区,无需扫全表)
2.更易于维护(删除的时候可以删除整个分区)
3.分区表的数据可以分布在不同物理设备上,可以高效的利用多个硬件设备
4.备份,恢复独立的分区。这在非常大的数据集的场景下效果非常好
几点限制
1、 一个表最多只能有1024个分区
2、 在mysql5.1中,分区表必须是整数,或者是返回整数的表达式。在mysql5.5中,某些场景中可以直接使用列来分区,下表就可以将每一年的销售额放在不同的分区里:
为什么使用
- 当数据列特别大,不想全表扫描
- 不希望使用索引(索引需要空间和维护消耗)
分区要做的事情。可以理解为索引的最初形态,以非常小的代价定位到需要的数据在那一片,在这片区域中你可以做顺序扫描,还可以建索引,还可将数据都缓存在内存等等。而且分区所需代价非常低,只需要一个简单的表达式就可以知道每个分区放的是什么数据。
如何使用
为了保证大数据量的可扩展性,一般有下面两个策略:
1、 全量扫描数据,不需要任何索引可以使用简单的分区方式存放表,不要任何索引,根据分区的规则大致定位需要的数据位置。只要能够使用where条件,将需要的数据限制在少数分区中,则效率很高
2、 索引数据,并分离热点。如果数据有明显的热点,而且除了这部分数据,其他数据很少被访问到,那么可以将这部分热点数据单独放到一个分区中,让这个分区的数据能够有机会都缓存在内存中。这样查询就可以只访问一个很小的分区表,能够使用索引,也能够有效的使用缓存。
2.视图:
概念:
视图本身是一个虚拟表,不存放任何数据。使用sql语句访问视图的时候,它返回的数据是从其他表生成的。(表的数据变了,视图的结果自然也变了)
优点:
1)利用视图可以简化查询语句
2)可以进行权限的控制(把表的权限封闭,但是开放相应的视图权限,视图里只开放部分数据列)
3) 某些情况下视图也可以提升性能(极少数的情况下)
视图不可更新的情况:
如果视图包含:聚合函数 SUM(), MIN(), MAX(), COUNT() 等,DISTINCT,GROUP BY,HAVING,UNION,UNION ALL,Join等。那么它就是不可更新的。
3.外键约束(带来很多额外消耗,不推荐用):
InnoDB是目前MySql中唯一支持外键的内置存储引擎。
外键有成本的,修改数据的时候都要在另一张表多执行一次查找操作。
外键约束使得查询需要额外访问一些别的表,意味着需要额外的锁。
外键在相关数据的删除和更新上也比在应用中维护更高效。
4. 在mysql内部存储代码:
存储过程:
提高执行速度 (很大程度是因为它无须网络通信开销,解析开销和优化器开销等)
触发器:
在执行insert,update或者delete的时候,执行一些特定的操作
基于行触发,每个表的每一个事件只能绑定一个触发器。
事件:
完全在mysql内部实现的,类似linux的定时任务,每隔一段时间执行一段sql代码(通常将复杂的sql封装到存储过程中,执行的时候只需要做一个简单的call调用)。并且执行事件所创建的线程也会在执行结束后销毁,不会放在线程缓存中。
在存储程序中保留注释:
指定一个极大的版本号,类似于99999
5.游标:
指向存储在临时表中的对象。因此是只读的。逐行指向查询结果。
6.绑定变量:
好处:
1.解析一次sql
2.执行计划会有部分缓存
3.二进制的方式只发送参数和句柄减少通信量
bind_param("sss", firstname,lastname,
$email);
该函数绑定了 SQL 的参数,且告诉数据库参数的值。
"sss" 参数列处理其余参数的数据类型。s
字符告诉数据库该参数为字符串。
7.自定义函数:
函数存储着一系列sql语句,调用函数就是一次性执行这些语句。所以函数可以降低语句重复。(但注意的是函数注重返回值,不注重执行过程,所以一些语句无法执行。所以函数并不是单纯的sql语句集合)
8.字符集:
如果是使用UTF-8,临时表和缓冲区会按照每个字符3个字节的最大占用空间来分配存储空间。这可能会消耗更多的内存或磁盘空间。并且注意让字符集和mysql字符集配置相符合,否则可能会出现由于字符集转换让某些索引无法正常使用的情况。
9.全文索引:
MyISAM因为在锁粒度和崩溃恢复上的缺点,使得在大型全文索引场景中基本无法使用。我们通常帮助客户端构建和使用Sphinx来解决全文索引问题。
10. 分布式(XA)事务:
XA事务是一种在多个服务器之间同步数据的方法,如果由于某些原因不能使用MySQL本身的复制,或者性能并不是瓶颈的时候,可以尝试使用。
11.查询缓存:
完全相同的查询在重复执行的时候,查询缓存可以立即返回结果,无需在数据库中重新执行一次。
实质上是缓存 SQL 的 Hash 值和该 SQL 的查询结果,如果运行相同的 SQL,服务器直接从缓存中取结果。
表的数据有一条发生变化,那么和这个表相关的缓存数据都将失效。
如果查询缓存的作用很大的话,那就配置一个很小的查询缓存空间(比如几十兆)