MySQL高级特性
7.1 分区表
对于用户来说,分区表是一个独立的逻辑表,但是底层由多个物理子表组成。实现分区的代码实际上是对一组底层表的具柄对象的封装。
7.2 视图
视图本身是一个虚拟表,不存放任何数据。在使用SQL语句访问视图的时候,它返回的数据是MySQL从其他表中生成的,视图和表是在同一个命名空间,MySQL在很多地方对于视图和表是同样对待的。
7.6 绑定变量
支持服务器端的绑定变量(prepared statement)大大提高了客户端和服务器数据传输的效率。
当创建一个绑定变量SQL时,客户端向服务器发送了一个SQL语句的原型。服务器收到这个SQL语句后解析并存储这个SQL语句的部分执行计划,返回给客户端一个SQL语句的处理句柄。
绑定变量的SQL,使用问好标记可以接受参数的位置,当真正需要执行具体查询的时候,则使用具体值代替这些问号,如:
INSERT INTO tbl(col1, col2, col3) VALUES(?, ?, ?);
可以通过向服务器发送各个问号的取值和这个SQL句柄来执行一个具体的查询。
绑定变量有如下优势:
- 服务器只需要解析一次SQL语句
- 服务器的某系优化器的工作只需要执行一次,因为它会缓存一部分的执行计划
- 以二进制的方式只发送参数和句柄,节省了内存,减少了网络开销
- 仅仅是参数,而不是整个查询语句,网络开销更小
- MySQL在存储参数时,直接将其存放到缓存中,不再需要在内存中多次复制
- 相对更加安全
绑定变量的限制:
- 绑定变量是会话级别的,连接之间不能共用绑定变量句柄。一旦连接断开,则原来的句柄也不能使用了。(连接池和持久化连接可以在一定程度上缓解这个问题)
- 并不是所有的时候使用绑定变量都能获得更好的性能
- 如果总是忘记释放绑定变量资源,服务器端很容易发生资源“泄漏”。绑定变量的SQL总数的限制是一个全局限制,所以某一个地方的错误可能会对其他所有的线程产生影响
- 有些操作,如
BEGIN
无法在绑定变量中完成
客户端也可以模拟绑定变量。客户端驱动程序接受一个带参数的SQL,再将指定的值带入其中,最后将完整的查询发送到服务器端。
7.7 用户自定义函数(UDF)
UDF没有只能用SQL来编写的限制,可以使用支持C语言调用约定的任何变成语言来实现。
7.10 全文索引
MyISAM对全文索引的支持有很多的限制,例如表级别锁对性能的影响、数据文件的崩溃、崩溃后的恢复等,这使得MyISAM的全文索引对于很多应用场景并不适合。多数情况下我们建议使用别的解决方案:Sphinx、Lucene、Solr、Groonga、Xapian或者Senna,或者使用MySQL 5.6版本之后的InnoDB的全文索引。