addiks/doctrine-sql-auto-optimizer

无需配置的即插即用工具,可自动优化通过 doctrine 发出的 SQL 查询

v0.1.10 2024-09-03 14:36 UTC

This package is auto-updated.

Last update: 2024-09-03 15:05:27 UTC


README

这是一个即插即用、无需配置的 Doctrine 扩展,可以在执行前优化所有 SQL 查询。(它也可以独立于 doctrine 使用,见下文 ...)

所有这些优化(根据上下文)都可以大大提高执行 SQL 语句的执行速度。

目前实现的功能

  • 移除查询中未在任何其他地方引用且不会影响结果集大小的 JOIN。
  • 移除当所有 JOIN 都是一对一且分组表达式是唯一列时的 GROUP BY 语句。
  • 如果结果集中不可能有任何重复的行,则从 SELECT 语句中移除 DISTINCT。
  • 如果所有计数值已经都是唯一的,则从 COUNT(DISTINCT ...) 中移除 DISTINCT。

设置

首先:composer require addiks/doctrine-sql-auto-optimizer

然后,根据您的系统,有多种方法可以激活该扩展

Symfony

您可以导入此包捆绑的服务-xml 文件

<imports>
    <import resource="../../vendor/addiks/doctrine-sql-auto-optimizer/symfony-services.xml" />
</imports>

(根据您的配置,您可能需要更改导入路径)

或者您可以定义自己的服务

<service
    id="addiks_auto_optimizer.doctrine.event_listener"
    class="Addiks\DoctrineSqlAutoOptimizer\DoctrineEventListener"
>
    <argument type="service" id="logger" />
    <argument type="service" id="cache.app.simple" />
    <tag name="doctrine.event_listener" event="postConnect" />
</service>

Doctrine

确保在 doctrine 连接到数据库之前执行以下操作

$sqlOptimizingEventListener = new \Addiks\DoctrineSqlAutoOptimizer\DoctrineEventListener(
    $logger, # Monolog\Logger                  REQUIRED
    $cache   # Psr\SimpleCache\CacheInterface  OPTIONAL
);

# Doctrine\Common\EventManager
$eventManager->addEventListener(['postConnect'], $sqlOptimizingEventListener);

需要(monolog-)记录器,以便优化器可以将任何问题报告给您(作为通知)。

缓存是可选的,但强烈推荐。没有缓存,每次查询都会运行(慢速)优化过程。

原生 PHP(没有 doctrine)

您也可以完全在没有 doctrine 的情况下使用查询优化器

$schemas = \Addiks\StoredSQL\Schema\SchemasClass::fromPDO(
    $pdo,   # \PDO                            REQUIRED
    $cache, # Psr\SimpleCache\CacheInterface  OPTIONAL
);

$optimizer = new \Addiks\DoctrineSqlAutoOptimizer\DefaultSQLOptimizer(
    $cache   # Psr\SimpleCache\CacheInterface  OPTIONAL
);

$optimizedSql = $optimizer->optimizeSql($inputSql, $schemas);

同样,缓存是可选的,但强烈推荐。没有缓存,没有速度。在 SchemasClass::fromPDO 调用中创建模式时进行缓存(如果提供缓存的话)。