MySQL高级特性
1. 分区表:分区表是一种粗粒度的、简易的索引策略,适用于大数据量的过滤场景。最适合的场景是,在没有合适的索引时,对几个分区进行全表扫描,或者是只有一个分区和索引是热点,而且这个分区和索引
能够在内存中;限制单表分区数不要超过150个,并且注意某些导致无法分区过滤的细节,分区表对单条记录的查询并没有什么优势,需要注意这类查询的性能。
2. 视图:对于好几个表的复杂查询,使用视图有时候会大大简化问题。当视图使用临时表时,无法将WHERE条件下推到各个具体的表中,也不能使用任何索引,需要特别注意这列查询的性能。如果为了便利,
使用视图是很合适的。
3. 外键:外键限制会将约束放到MySQL中,这对于必须维护外键的场景,性能会更高。不过这也会带来额外的复杂性和额外的索引消耗,还会增加多表之间的交互,会导致系统中更多的锁和竞争。外键可以被看
作是一个确保系统完整性的额外的特性,但是如果设计的是一个高性能的系统,那么外键就显得很臃肿了。很多人在更在意系统的性能的时候都不会使用外键,而是通过应用程序来维护的。
4. 存储过程:MySQL本身实现了存储过程、触发器、存储函数和事件,老实说,这些特性并没什么特别的。而且对于基于语句的复制还有很多问题。通常,使用这些特性可以帮你节省很多网络开销--很多情况下,
减少网路开销可以大大提升系统的性能。在某些经典的场景下,你可以使用这些特性(例如中心化业务逻辑、绕过全线系统等),但需要注意在MySQL中,这些特性并没有别的数据库系统那么成熟和全面。
5. 绑定变量:当查询语句的解析和执行计划生成消耗了主要时间,那么绑定变量可以在一定程度上解决问题。因为只需要解析一次,对于大量重复类型的查询语句,性能会有很大的提高。另外,执行计划的缓存
和传输使用的二进制协议,这都使得绑定变量的方式比普通SQL语句执行的方式要更快。
6. 插件:使用C或者C++编写的插件可以让你最大程度的扩展MySQL功能。插件功能非常强大。
7. 字符集:字符集是一种字节到字符之间的映射,而校对规则是一个字符集的排序方法。很多人使用Latin1(默认字符集,对英语和某些欧洲语言有效)或者UTF-8。如果使用的是UTF-8,那么在使用临时表和缓冲区
的时候需要注意:MySQL会按照每个字符三个字节的最大占用空间来分配存储空间,这可能消耗更多的内存或者磁盘空间。注意让字符集和MySQL字符集配置相符,否则可能会由于字符集转换让某些索引无法使用。
8. 全文索引:在5.6版本之前只有MyISAM支持全文索引,不过据说5.6开始,InnoDB也将支持全文索引。MyISAM因为在锁粒度和崩溃恢复上的缺点,使得在大型全文索引场景中基本无法使用。这时,我们通常
帮助客户构建和使用Sphinx来解决全文索引问题。
9. XA事务:很少有人使用MySQL的XA事务特性。除非你真正明白参数innodb_support_xa的意义,否则不要修改这个参数的值,并不是只有显式使用XA事务时才需要设置这个参数。InnoDB和二进制日志也是
需要使用XA事务来做协调的,从而确保在系统崩溃的时候,数据能够一致地恢复。
10. 查询缓存:完全相同的查询在重复执行的时候,查询缓存可用立即返回结果,而无须在数据库重新执行一次。根据我们的经验,在高并发压力环境中查询缓存会导致系统性能的下降,甚至僵死。如果你一定要使用
查询缓存,那么不要设置太大的内存,而且只有在明确收益的时候才使用。那该如何判断是否应该使用查询缓存呢?建议使用Percona Server,观察更细致的日志,并做一些简单的计算。还可以查看缓存命中率(
并不是总是有用)、"INSERTS和SELECT比率"(这个参数也并不直观)或者"命中和写入比率"(这个参考意义较大)。查询缓存时一个非常方便的缓存,可对应用程序完全透明,无需任何额外的编码,但是,如果希望
有更高的缓存效率,我们建议使用memcached或者其他类似的解决方案。
原文:http://www.cnblogs.com/Jtianlin/p/5161968.html