danieldharvey/stinky-query-finder

dev-master 2017-06-02 10:12 UTC

This package is not auto-updated.

Last update: 2024-09-12 06:14:52 UTC


README

在它们破坏一切之前,找出可能非常糟糕的MySQL查询。 Build Status

它做了什么?

您传递一个PDO对象和一个SQL调用给它,它会了解一些关于您数据库的信息,并确定您的查询是否可能是垃圾。

它是如何决定的?

基本上,通过以下条件:a) 表是否非常长 - 如果不是,那么它将是好的。b) 如果表很长,查询是否使用一个或多个索引来提高查询正确性的可能性。

我如何使用它?

创建一个PDO对象,将其传递给一个新的Stinkers对象,然后询问您的SQL是否是狗屎。

$dbName = "greatDB"

$dsn = "mysql:dbname={$dbName};host=127.0.0.1";

$pdo = new \PDO($dsn, "username", "excellentPassword");

$sql = "SELECT COUNT(1) FROM excellentTable WHERE thingID=2229 AND theDate='2017-05-12'";

$stinkers = new \DanielJHarvey\QueryStinkers\Stinkers($dbName, $tables, $pdo);

$problematicQuery = $stinkers->checkQuery($sql);

$problematicQuery将返回false(没有问题,很好)或一个基于数组的堆栈跟踪(以便可以定位产生问题的查询代码)

这不会慢一些吗?

是的,很遗憾,所以请不要在生产环境中使用它。如果您希望加快速度,可以像这样缓存Stinkers创建的数据库表数据


$tables = $stinkers->getTables();

cacheTablesDataWithYourExcellentCachingSolution($tables);

然后您就可以像这样再次使用它了


$dbName="excellentDB"
$tables = getCachedTablesFromYourGreatCachingFunction();

$stinkers = new \DanielJHarvey\QueryStinkers\Stinkers($dbName, $tables);

// no need to rebuild table data, everything is fine