实例剖析:MySQL数据库优化详解(3)

作者:叶金荣 来源:天极yesky 时间:2008-11-22 12:19:00 

1.2 应用设计的可移植性

由于各种不同的数据库实现了各自的SQL标准,这就需要我们尽量使用可移植的SQL应用。查询和插入操作很容易就能做到可移植,不过由于更多的约束条件的要求就越发困难。想要让一个应用在各种数据库系统上快速运行,就变得更困难了。

为了能让一个复杂的应用做到可移植,就要先看这个应用运行于哪种数据库系统之上,然后看这些数据库系统都支持哪些特性。

每个数据库系统都有某些不足。也就是说,由于设计上的一些妥协,导致了性能上的差异。

可以用MySQL的 crash-me 程序来看选定的数据库服务器上可以使用的函数,类型,限制等。crash-me 不会检查各种可能存在的特性,不过这仍然是合乎情理的理解,大约做了450次测试。

一个 crash-me 的信息类型的例子就是,它会告诉您如果想使用Informix 或 DB2的话,就不能使字段名长度超过18个字符。

crash-me 程序和MySQL基准使每个准数据库都实现了的。可以通过阅读这些基准程序是怎么写的,自己就大概有怎样做才能让程序独立于各种数据库这方面的想法了。这些程序可以在MySQL源代码的 `sql-bench' 目录下找到。他们大部分都是用Perl写的,并且使用DBI接口。由于它提供了独立于数据库的各种访问方式,因此用DBI来解决各种移植性的问题。

想要看到 crash-me 的结果,可以访问:http://dev.mysql.com/tech-resources/crash-me.php. 访问 http://dev.mysql.com/tech-resources/benchmarks 可以看到基准的结果。

如果您想努力做到独立于数据库,这就需要对各种SQL服务器的瓶颈都有一些很好的想法。例如,MySQL对于 MyISAM 类型的表在检索以及更新记录时非常快,但是在有并发的慢速读取及写入记录时却有一定的问题。作为Oracle来说,它在访问刚刚被更新的记录时有很大的问题(直到结果被刷新到磁盘中)。事务数据库一般地在从日志表中生成摘要表这方面的表现不怎么好,因为在这种情况下,行记录锁几乎没用。

为了能让应用程序真正的做到独立于数据库,就必须把操作数据的接口定义的简单且可扩展。由于C++在很多系统上都可以使用,因此使用C++作为数据库的基类结果很合适。

如果使用了某些数据库独有的特定功能(比如 REPLACE 语句就只在MySQL中独有),这就需要通过编写替代方法来在其他数据库中实现这个功能。尽管这些替代方法可能会比较慢,但是它能让其他数据库实现同样的功能。

在MySQL中,可以在查询语句中使用 /*! */ 语法来增加MySQL特有的关键字。然而在很多其他数据库中,/**/ 却被当成了注释(并且被忽略)。

如果有时候更高的性能比数据结果的精确更重要,就像在一些Web应用中那样,这可以使用一个应用层来缓存结果,这可能会有更高的性能。通过让旧数据在一定时间后过期,来合理的更新缓存。这是处理负载高峰期时的一种方法,这种情况下,可以通过加大缓存容量和过期时间直到负载趋于正常。

这种情况下,建表信息中就要包含了初始化缓存的容量以及正常刷新数据表的频率。

一个实现应用层缓存的可选方案是使用MySQL的查询缓存(query cache)。启用查询缓存后,数据库就会根据一些详情来决定哪些结果可以被重用。它大大简化了应用程序,详情请看"5.11 The MySQL Query Cache"。

标签:
0
投稿

猜你喜欢

  • python实现KNN分类算法

    2023-03-01 07:53:36
  • 如何获知用户的IP?

    2009-11-24 20:52:00
  • 用Dreamweaver MX巧妙格式化表格

    2008-03-18 16:39:00
  • 微信小程序 滚动选择器(时间日期)详解及实例代码

    2024-01-27 22:57:53
  • SQL Server创建索引教程

    2010-07-02 21:09:00
  • 三个520专属Python表白代码分享

    2023-09-19 21:20:06
  • 详解Python Selenium如何获取鼠标指向的元素

    2021-12-03 10:45:39
  • 详解Node.js中的事件机制

    2024-05-03 15:58:52
  • javascript获取select值的方法完整实例

    2024-04-22 12:49:18
  • 如何利用python查找电脑文件

    2022-02-16 18:30:37
  • MySQL命令终端有beep声

    2009-02-26 15:27:00
  • Python3时间转换之时间戳转换为指定格式的日期方法详解

    2023-02-12 09:41:18
  • 怎么样才能让层显示在FLASH之上呢

    2008-03-05 13:32:00
  • 浅谈dataframe中更改列属性的方法

    2022-12-08 02:00:06
  • 使用Python给头像戴上圣诞帽的图像操作过程解析

    2023-03-17 13:22:01
  • Deepin20安装开发环境的超详细教程

    2023-12-16 20:05:41
  • JavaScript中的this指针用法

    2007-08-26 17:29:00
  • TensorFlow tf.nn.max_pool实现池化操作方式

    2021-08-20 20:36:45
  • ORACLE学习笔记-新建用户及建表篇

    2024-01-18 15:33:46
  • Python中scatter函数参数及用法详解

    2022-05-03 09:55:58
  • asp之家 网络编程 m.aspxhome.com