mysql--高级特性

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,服务器直接从缓存中取结果。

        表的数据有一条发生变化,那么和这个表相关的缓存数据都将失效。

        如果查询缓存的作用很大的话,那就配置一个很小的查询缓存空间(比如几十兆)


你可能感兴趣的:(mysql--高级特性)