由于所有SQL服务器都实现标准SQL的不同部分,因此需要编写可移植的数据库应用程序。对于非常简单的选择和插入,很容易实现可移植性,但是,您需要的功能越多,难度就越大。如果您想要一个与许多数据库系统一起快速运行的应用程序,它将变得更加困难。
所有数据库系统都有一些弱点。即,它们具有导致不同行为的不同设计折衷。
为了使复杂的应用程序具有可移植性,您需要确定它必须使用哪些SQL服务器,然后确定这些服务器支持哪些功能。您可以使用MySQL crash-me程序查找可以与选择的数据库服务器一起使用的函数,类型和限制。crash-me不会检查所有可能的功能,但是它仍然相当全面,可以执行约450次测试。crash-me可以提供的信息类型的一个示例是,如果您希望能够使用Informix或DB2,则不应使用长度超过18个字符的列名。
在碰撞我的程序和MySQL基准都非常独立于数据库。通过查看它们的编写方式,您可以了解为使自己的应用程序数据库独立而必须执行的操作。可以在MySQL源分发的sql-bench目录中找到这些程序。它们是用Perl编写的,并使用DBI数据库接口。使用DBI本身解决了部分可移植性问题,因为它提供了独立于数据库的访问方法。
如果要争取数据库独立性,则需要对每个SQL Server的瓶颈有所了解。例如,MySQL在为MyISAM表检索和更新行时非常快,但是在将慢速的读取器和写入器混合在同一表上时存在问题。另一方面,当您尝试访问最近更新的行(直到将它们刷新到磁盘)时,Oracle遇到了一个大问题。事务数据库系统通常不能很好地从日志表生成摘要表,因为在这种情况下,行锁定几乎没有用。
为了使您的应用程序真正独立于数据库,您应该定义一个易于扩展的接口,您可以通过该接口来操作数据。例如,大多数系统上都可以使用C ++,因此对数据库使用基于C ++类的接口是有意义的。
如果您使用特定于给定数据库系统的某些功能(例如REPLACE语句,该功能特定于MySQL),则应通过编码替代方法为其他SQL Server实现相同的功能。尽管替代方法可能较慢,但它使其他服务器可以执行相同的任务。
使用MySQL,您可以使用/ *!* /语法,用于将MySQL特定关键字添加到语句中。/ * * /中的代码被大多数其他SQL服务器视为注释(并忽略)。
如果对于某些Web应用程序而言,高性能比准确性更重要,则可以创建一个应用程序层来缓存所有结果,从而为您提供更高的性能。通过让旧结果在一段时间后过期,可以合理地保持缓存的新鲜度。这提供了一种处理高负载尖峰的方法,在这种情况下,您可以动态增加缓存大小,并设置更高的过期超时,直到一切恢复正常为止。
在这种情况下,表创建信息应包含有关初始高速缓存大小以及通常应多长时间刷新一次表的信息。
实现应用程序缓存的一种有吸引力的替代方法是使用MySQL查询缓存。通过启用查询缓存,服务器处理确定是否可以重用查询结果的详细信息。这简化了您的应用程序。
我们将MySQL用于什么
本节介绍了MySQL的早期应用程序。
在MySQL的最初开发过程中,MySQL的功能是为了适应我们最大的客户而设计的,该客户为瑞典几个最大的零售商处理数据仓库。
从所有商店,我们每周都会获得所有奖励卡交易的摘要,并有望为商店所有者提供有用的信息,以帮助他们找到广告活动如何影响自己的客户。
数据量非常大(每月约有700万次摘要交易),我们拥有410年需要呈现给用户的数据。我们每周收到客户的请求,这些客户希望立即从该数据访问新报告。
我们通过每月将所有信息存储在压缩的“事务表”中来解决此问题。我们有一组简单的宏,这些宏从存储交易的表中生成按不同条件(产品组,客户ID,商店等)分组的摘要表。这些报告是由小型Perl脚本动态生成的网页。该脚本解析网页,在其中执行SQL语句,然后插入结果。我们本来会使用PHP或mod_perl,但是当时它们不可用。
对于图形数据,我们用C语言编写了一个简单的工具,可以处理SQL查询结果并根据这些结果生成GIF图像。该工具也是从解析Web页面的Perl脚本中动态执行的。
在大多数情况下,只需复制现有脚本并修改其使用的SQL查询即可创建新报告。在某些情况下,我们需要在现有的汇总表中添加更多列或生成一个新的列。这也非常简单,因为我们将所有事务存储表都保留在磁盘上。(这总计约有50GB的交易表和200GB的其他客户数据。)
我们还允许客户使用ODBC直接访问摘要表,以便高级用户可以自己尝试数据。
该系统运行良好,并且使用适度的Sun Ultra SPARCstation硬件(2 x 200MHz)处理数据时,我们没有遇到任何问题。最终,系统被迁移到Linux。
MySQL基准套件
该基准套件旨在告诉任何用户,给定的SQL实现执行的操作好坏。通过查看任何MySQL源代码发行版中sql-bench目录中的代码和结果,可以很好地了解基准测试的工作方式。
请注意,该基准测试是单线程的,因此它测量执行操作的最短时间。我们计划将来将多线程测试添加到基准套件中。
要使用基准套件,必须满足以下要求:
-
基准套件随MySQL源分发一起提供。您可以从这里下载已发布的发行版,也可以使用当前的开发源树。
-
基准脚本使用Perl编写,并使用Perl DBI模块访问数据库服务器,因此必须安装DBI。对于要测试的每个服务器,您还需要特定于服务器的DBD驱动程序。例如,要测试MySQL,PostgreSQL和DB2,必须安装DBD :: mysql,DBD :: Pg和DBD :: DB2模块。
获得MySQL源代码分发后,您可以在其sql-bench目录中找到基准套件。要运行基准测试,请构建MySQL,然后将位置更改为sql-bench目录并执行run-all-tests脚本:
shell> cd sql-bench
shell> perl run-all-tests --server=server_name
总结
以上是字节二面的一些问题,面完之后其实挺后悔的,没有提前把各个知识点都复习到位。现在重新好好复习手上的面试大全资料(含JAVA、MySQL、算法、Redis、JVM、架构、中间件、RabbitMQ、设计模式、Spring等),现在起闭关修炼半个月,争取早日上岸!!!
下面给大家分享下我的面试大全资料
- 第一份是我的后端JAVA面试大全
后端JAVA面试大全
- 第二份是MySQL+Redis学习笔记+算法+JVM+JAVA核心知识整理
![字节二面拜倒在“数据库”脚下,闭关修炼半个月,我还有机会吗?] 需要zi料+ 绿色徽【vip1024b】
(https://upload-images.jianshu.io/upload_images/24616006-e060ef83453572aa?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
- 第三份是Spring全家桶资料
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
2/auto-orient/strip%7CimageView2/2/w/1240)
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理
- 第三份是Spring全家桶资料
[外链图片转存中…(img-q5N8sL9q-1710362846910)]
MySQL+Redis学习笔记算法+JVM+JAVA核心知识整理