tpetry/php-mysql-explain

PHP的MySQL EXPLAIN计划可视化

1.0.0 2024-09-26 11:17 UTC

This package is auto-updated.

Last update: 2024-09-26 11:27:20 UTC


README

License PHP Latest Version on Packagist GitHub Unit Tests Action Status GitHub Static Analysis Action Status

使用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)。有关更多信息,请参阅许可证文件