addiks / doctrine-sql-auto-optimizer
无需配置的即插即用工具,可自动优化通过 doctrine 发出的 SQL 查询
v0.1.10
2024-09-03 14:36 UTC
Requires
- php: ^8.2.0
- addiks/stored-sql: ^0.1.6
- doctrine/dbal: ^2.13
- monolog/monolog: 3.x-dev || 2.* || ^1.27.1
- symfony/http-kernel: ^4.4 || ^5.4 || ^6.4 || ^7.1
- webmozart/assert: ^1.11 || ^1.3
Requires (Dev)
- addiks/more-php-cs-fixers: v0.2.0
- kubawerlos/php-cs-fixer-custom-fixers: ^2.4
- phpstan/phpstan: ^1.8
- phpstan/phpstan-doctrine: ^1.3
- phpstan/phpstan-webmozart-assert: 1.2.x-dev
- phpunit/phpunit: ^9.5
- psalm/plugin-phpunit: ^0.15.1
- psr/simple-cache: ^3.0
- symfony/cache-contracts: *
- symfony/yaml: ^5.2
- vimeo/psalm: ^4.29
- wikimedia/composer-merge-plugin: ^2.1
Suggests
- psr/simple-cache: For caching without symfony
- symfony/cache-contracts: For caching with symfony
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
调用中创建模式时进行缓存(如果提供缓存的话)。