错误的SQL查询语句返回大量重复数据将导致意外的性能急剧下降。
比如存在如下关系:
*) Deal has 1 City if (deal.is_multi_city == false);
*) Deal has many DealCities if (deal.is_multi_city == true);
如果我们想查询所有某个城市的multi-city和非multi-city的Deal, 写出如下的语句将导致很恶劣的性能问题:
$query = "select Deal.id from t_deals as Deal,t_deal_cities as DealCity, t_cities as City where ( (Deal.is_multi_city_deal = 1 and Deal.id=DealCity.deal_id and DealCity.city_id=City.id ) or (Deal.is_multi_city_deal = 0 and Deal.city_id=City.id ) ) and ( City.slug='".$cityslug."')";
return $this->query($query);
其中OR后面的查询有一个很隐蔽的问题: 忽略了非常重要的表间外键约束:Deal.id=DealCity.deal_id, 将导致大量的数据冗余。
实际上OR前后的查询其范围是不同的,OR后面的语句不应该把不相关的表格DealCity引入进来。通过联合查询我们可以达到同样的目的并且消除了业务逻辑和查询范围上的混乱:
$query = "SELECT Deal.id
FROM t_deals AS Deal, t_deal_cities AS DealCity, t_cities AS City
WHERE
Deal.is_multi_city_deal =1
AND Deal.id = DealCity.deal_id
AND DealCity.city_id = City.id
AND City.slug = '".$cityslug."'
UNION
SELECT Deal.id
FROM t_deals AS Deal, t_cities AS City
WHERE Deal.is_multi_city_deal =0
AND Deal.city_id = City.id
AND City.slug = '".$cityslug."'";
这个语句改正使得网站首页从10s以上访问时间大大降低到2s以下。性能得到5倍以上的提高。
从中可以看出糟糕的数据模型和查询语句将对网站性能造成多大的影响。
很多情况下其效益远比通过加应用服务器和提高带宽大得多。
分享到:
相关推荐
客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急剧下降,小型机idle所剩无几,应用服务器断连、超时,严重影响业务的正常运行。因此,称低效的SQL语句为...
客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急剧下降,小型机idle所剩无几,应用服务器断连、超时,严重影响业务的正常运行。因此,称低效的SQL语句为...
客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急剧下降,小型机idle所剩无几,应用服务器断连、超时,严重影响业务的正常运行。因此,称低效的SQL语句为...
如果注册表编辑不当,则可能会导致严重的问题并可能需要您重新安装操作系统。Microsoft 不保证可以解决因注册表编辑不当而导致的问题。在编辑注册表之前,请备份所有重要数据。有关如何备份、恢复和编辑注册表的信息...
客服业务受到SQL语句的影响非常大,在规模比较大的局点,往往因为一个小的SQL语句不够优化,导致数据库性能急剧下降,小型机idle所剩无几,应用服务器断连、超时,严重影响业务的正常运行。因此,称低效的SQL语句为...
修改外部数据库在4.12版中导致的不兼容问题,并增加了对MS SQL Server数据库中image和text字段类型的说明。 7. 修改扩展界面支持库一,禁止透明标签在父窗口刷新时自动刷新,以解决其导致窗口刷新缓冲的问题。 8....
1. 无索引、索引失效导致慢查询 ...如果数据库操作是基于表锁实现的,试想下,如果一张订单表在更新时,需要锁住整张表,那么其它大量数据库操作(包括查询)都将处于等待状态,这将严重影响到系统的并发性能。 这时,I
mysqldumpslow是一个用...特别是对于存在大量并发事务的OLTP系统,开启慢日志功能对系统整体性能来讲将是一个沉重的负担,特别是在某些索引失效或者数据表存储物理变更时将会导致恶性循环,严重时可能会导致系统崩溃。
- 3 - 1.4.3 SQL语言在VB中的应用 - 4 - 1.5 数据库平台介绍 - 4 - 1.5.1 Access 2007 数据库简介 - 4 - 1.5.2 数据库的基本概念 - 5 - 1.5.3 结构化查询语言SQL - 6 - 1.5.4 SQL语句简介 - 6 - 2 系统设计 - 7 - ...
使用Toad,非常容易检测到存储过程的错误,开发人员可以一步一步运行PL/SQL语句来识别问题。调试会话可以和其他程序会话同时进行。 SQLab Xpert Option: 帮助开发人员优化SQL,为他们提供各种优化模式下SQL执行...
程序上存在数据库的问题,那就必须采用更加专业的工具来抓取出现问题的程序,主要是程序中执行效率很低的sql语句,weblogic可以采用introscope定位,期间可以注意观察一下jvm的垃圾回收情况看是否正常,我在实践中...
<br>IBatisNet是一个轻量级ORMap工具,它把所有的SQL脚本以模板的方式集中到若干个XML配置文件里,用反射的方式向把C#类实体对象属性与SQL模板的参数绑定,动态生成参数化的SQL语句发送给数据库执行,查询的结果...
<br>IBatisNet是一个轻量级ORMap工具,它把所有的SQL脚本以模板的方式集中到若干个XML配置文件里,用反射的方式向把C#类实体对象属性与SQL模板的参数绑定,动态生成参数化的SQL语句发送给数据库执行,查询的结果...
<br>IBatisNet是一个轻量级ORMap工具,它把所有的SQL脚本以模板的方式集中到若干个XML配置文件里,用反射的方式向把C#类实体对象属性与SQL模板的参数绑定,动态生成参数化的SQL语句发送给数据库执行,查询的结果...
本测试集包含用于测试Mercury Tours网站的功能正确性的测试用例。 设置测试集属性中的详细信息: In ITG Request Id, add the IT Governance request ID. Note that this is relevant only when integrating ...
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...
GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收...