1.分区表:
概念:
底层用多个物理子表组成。对于应用层来说可以不做变化,我们无需改变原有的SQL语句
建表时使用PARTITION BY定义每个分区存放的数据
原理:
打开并锁住所有的底层表,优化器判断可过滤的分区,继而进行增删改查
适用场景:
1.表很大无法全部放到内存中(查询的时候过滤掉一些分区,无需扫全表)
2.更易于维护(删除的时候可以删除整个分区)
3.分区表的数据可以分布在不同物理设备上,可以高效的利用多个硬件设备
4.备份,恢复独立的分区。这在非常大的数据集的场景下效果非常好
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,服务器直接从缓存中取结果。
表的数据有一条发生变化,那么和这个表相关的缓存数据都将失效。
如果查询缓存的作用很大的话,那就配置一个很小的查询缓存空间(比如几十兆)