tpetry / php-mysql-explain
PHP的MySQL EXPLAIN计划可视化
Requires
- php: >=7.4
- ext-json: *
- nyholm/psr7: ^1.6.0
- psr/http-client: ^1.0
- symfony/polyfill-php81: ^1.22
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.64.0
- mockery/mockery: ^1.6.12
- pestphp/pest: ^1.23.1|^2.0|^3.0
- php-http/mock-client: ^1.6
- phpstan/phpstan: ^1.12.4
- spatie/ray: ^1.41
- vlucas/phpdotenv: ^5.6
README
使用EXPLAIN命令进行MySQL查询优化过于复杂:输出包含大量难以理解或完全误导的信息。
此PHP包收集了许多查询指标,这些指标将被发送到mysqlexplain.com并转换为更容易理解的形式。
安装
您可以通过composer安装此包
composer require tpetry/php-mysql-explain
用法
1. 查询定义
您想要分析的查询必须首先定义,包括所有使用的参数及其数据库连接。包括PHP的mysqli和PDO驱动程序的实现。但是,您也可以通过实现QueryInterface
来构建特定框架的实现。
注意
最低要求的PHP版本是7.4,但示例使用了PHP 8的命名参数语法以便更容易阅读。
mysqli驱动程序
在其最简单的形式中,您只需提供mysqli连接和要执行的查询
use Tpetry\PhpMysqlExplain\Queries\MysqliQuery; $mysqli = new mysqli('127.0.0.1', 'root', 'root', 'github'); $query = new MysqliQuery( connection: $mysqli, sql: 'SELECT * FROM issues', );
您还可以提供绑定到预处理语句的变量
$query = new MysqliQuery( connection: $mysqli, sql: 'SELECT * FROM issues WHERE type = ? AND num > ?', params: ['finished', 85], );
请注意,默认情况下,所有传递的变量都被解释为字符串。但是,您可以按照mysqli的bind_param函数的特性,将字符串作为最后一个参数传递
$query = new MysqliQuery( connection: $mysqli, sql: 'SELECT * FROM issues WHERE type = ? AND num > ?', params: ['finished', 85], types: 'si', );
PDO驱动程序
use Tpetry\PhpMysqlExplain\Queries\PdoQuery; $pdo = new PDO('mysql:host=127.0.0.1;dbname=github', 'root', 'root'); $query = new PdoQuery( connection: $pdo, sql: 'SELECT * FROM issues', );
您还可以提供使用位置或命名参数绑定到预处理语句的变量
$query = new PdoQuery( connection: $pdo, sql: 'SELECT * FROM issues WHERE type = ? AND num > ?', params: ['finished', 85], ); $query = new PdoQuery( connection: $pdo, sql: 'SELECT * FROM issues WHERE type = :type AND num > :num', params: ['type' => 'finished', 'num' => 85], );
请注意,默认情况下,所有传递的变量都被解释为字符串。但是,您可以将包含PDO::PARAM_*类型的数组作为最后一个参数传递
$query = new PdoQuery( connection: $pdo, sql: 'SELECT * FROM issues WHERE type = ? AND num > ?', params: ['finished', 85], types: [PDO::PARAM_STR, PDO::PARAM_INT], ); $query = new PdoQuery( connection: $pdo, sql: 'SELECT * FROM issues WHERE type = :type AND num > :num', params: ['type' => 'finished', 'num' => 85], types: ['type' => PDO::PARAM_STR, 'num' => PDO::PARAM_INT], );
2. 指标收集
现在,必须收集之前配置的查询的查询分析信息
use Tpetry\PhpMysqlExplain\Metrics\Collector; $metrics = (new Collector())->execute($query);
3. API调用
最后,必须将包含所有信息的$metrics
对象发送到mysqlexplain.com API
use GuzzleHttp\Client as GuzzleClient; use Tpetry\PhpMysqlExplain\Api\Client; $client = new Client(new GuzzleClient()); $response = $client->submit($metrics); var_dump($response->getUrl());
重要
此包不依赖于任何特定的HTTP客户端库,以避免与项目中正在使用的版本冲突。因此,您必须传递一个实现psr/http-client
的任何http库的对象。在此示例中,使用了流行的Guzzle HTTP库(composer require guzzlehttp/guzzle
)- 您可能已经安装了它。但是,您也可以从许多其他实现中选择。
测试
composer test
变更日志
有关最近更改的更多信息,请参阅CHANGELOG
贡献
有关详细信息,请参阅CONTRIBUTING
鸣谢
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件