改进SQL查询

时间:2015-06-23 10:56:04

标签: php mysql sql-server

我最近设计了一个使用大量查询的网站。在我开发网站期间,我遇到了一个非常耗时且令人沮丧的问题。

所以问题是,在某个时刻,我想在网站上添加一个额外的功能,它会对我的查询产生最大的影响,我需要更改大部分功能才能使功能正常运行。所以让我举一个例子:让我说我有一个用户表,我没有添加一列来检查用户是否被禁止。现在我添加了“禁止”列,现在问题是,我需要安排所有其他查询来检查用户是否先被禁止。我希望这是有道理的。

所以我的问题是,有没有办法可以最大限度地减少这些工作,而不是通过所有查询并修改它们(添加用户被禁止),我可以改为添加一次这个功能,查询可以工作吗?基本上我该如何改进?

我希望这是有道理的,如果不是,我会尽力解释它。

如果有助于提高我的编码知识,我们将不胜感激。

PS。 我正在使用SQL和PHP 。如果有一些比SQL更好的东西可以解决这个问题,那就建议离开。

谢谢

4 个答案:

答案 0 :(得分:1)

为什么不在用户登录时检查这个?如果(s)他被禁止,登录失败,所有进一步的查询都不可能首先执行。

一般情况下,您不应该将相同的逻辑扩展到多个代码位置,因为无论何时您想要调整某些内容,这都会导致这种情况。

创建可重用的重用方法。这甚至可以重用,以使用另一个WHERE条件或一个执行SQL请求本身的方法来增加给定的SQL(准备好的)语句。

答案 1 :(得分:1)

我理解你的问题。你有一些列规则。这是全球所有应用程序中使用的。例如,在我的情况下,有'status'列,并且有一些称为'important'的逻辑含义,如果列具有集合中的某个特定值,则会起作用。

所以,无论在哪里,要检查状态是否“重要”,我需要写一下:

WHERE `status` IN('INCIDENT', 'ERROR')

如果我需要将“FLAGGED”添加到重要状态列表中,我需要重写所有SQL查询:

WHERE `status` IN('INCIDENT', 'ERROR', 'FLAGGED')

一旦我厌倦了这一点。我决定编写一个MySQL函数来完成这项工作。称之为IS_STATUS_IMPORTANT(状态)。 但是这个解决方案没有通过测试,因为它降低了性能 - 它不允许MySQL正确使用索引。

我终于通过创建一些app-global条件解决了这个问题,让我们说:

class DbHelper {
    public static function importanceCondition($column_name) {
        return $column_name . " IN('INCIDENT', 'ERROR') ";
    }
}

现在我写的所有应用程序都是:

$sql = 'SELECT * FROM blah .... WHERE ...  AND ' .  DbHelper::importanceCondition('x.status');

如果我需要更改某些逻辑条件,我会在一个地方进行更改,并且它适用于整个应用程序。

在您的情况下,您可以添加一些功能

class DbHelper {
    ...
    public static function validUserCondition($user_alias) {
        return " ({$user_alias}.deleted = 0 AND {$user_alias}.banned = 0) ";
    }
}

答案 2 :(得分:1)

我理解你的问题有一些简单的解决方案,使用ORM(对象关系映射)查询哪个支持多个DB(SQL,mysql,Oracle DB,NoSql ......)

  

PHP ORM就像 - DoctrinePropel

  • ORM更好地支持大多数PHP框架
  • 使用查询的方式更好
  • 将功能划分为类的编码不太复杂
  • 易于管理表格中的关系

我希望这可以帮助您以更少的时间和更好的性能修改查询

答案 3 :(得分:0)

我假设您在每个页面都包含代码,以确保用户已成功登录。

如果是这种情况,那么您需要做的就是更改登录脚本以拒绝被禁用的用户,因此每个其他页面都将按原样运行并拒绝任何未登录的用户以及对这些用户的任何查询其他页面需要更改。