sarfraznawaz2005/indexer

Laravel 包,用于监控 SELECT 查询并提供最佳索引字段。

3.1.0 2021-10-02 08:27 UTC

README

Software License Latest Version on Packagist Total Downloads

Laravel Indexer

Laravel Indexer 监控页面运行的 SELECT 查询,并允许动态地向 SELECT 查询添加数据库索引。它随后在页面上展示 EXPLAIN 或 MySQL 的执行计划。Indexer 展示的结果将帮助您了解哪些索引对不同页面上的查询效果最佳。

由 Indexer 添加的索引在收集结果后会自动移除,同时保持现有索引不变。

注意:请勿在生产环境中使用此包!由于此包会动态地向数据库添加索引,强烈建议不要在生产环境中使用此包。

注意由于索引会动态添加和移除以生成结果,页面加载会变慢。

要求

  • PHP >= 7
  • Laravel 5.3+ | 6

安装

通过 composer 安装

composer require sarfraznawaz2005/indexer --dev

对于 Laravel < 5.5

将服务提供者添加到 config/app.php 中的 providers 部分

Sarfraznawaz2005\Indexer\ServiceProvider::class,

通过运行以下命令发布包的配置文件

php artisan vendor:publish --provider="Sarfraznawaz2005\Indexer\ServiceProvider"

应该发布 config/indexer.php 配置文件。

截图

启用时,您将在右下角看到黄色/绿色/红色框

  • 默认为黄色或当查询需要优化时
  • 当总查询数与优化查询数匹配时为绿色
  • 当发现一个或多个慢查询并需要优化时为红色

Main Window

配置

enabled : 启用或禁用 Indexer。默认情况下已禁用。

check_ajax_requests : 指定是否检查 AJAX 请求中的查询。

ignore_tables : 当您未使用 watched_tables 选项时,Indexer 会监视所有表。使用此选项,您可以忽略要监视的指定表。

ignore_paths : 这些路径/模式将不会被 Indexer 处理。

slow_time : 当查询被认为是慢查询时的毫秒时间。

output_to : 将结果输出到指定的类。默认包含 Web 类。

watched_tables : Indexer 要监视的数据库表。以下是一个示例

'watched_tables' => [
    'users' => [
        // list of already existing indexes to try
        'try_table_indexes' => ['email'],
        // new indexes to try
        'try_indexes' => ['name'],
        // new composite indexes to try
        'try_composite_indexes' => [
            ['name', 'email'],
        ],
    ],
],
  • 涉及 users 数据库表的查询将由 Indexer 监视。
    • try_table_indexes 包含您已应用到数据库表的索引名称。Indexer 将简单地尝试您现有的索引以显示 EXPLAIN 结果。在这种情况下,email 索引已存在于 users 表中。
    • try_indexes 可以用于动态地向数据库表添加新索引。在这种情况下,Indexer 将通过 try_indexes 和/或 try_composite_indexes 选项动态添加 name 索引,并展示该索引的性能。
    • 类似于 try_indexestry_composite_indexes 也可以用于动态地向数据库表添加复合索引。在这种情况下,由 nameemail 组成的复合索引将由 Indexer 动态添加,并展示该索引的性能。

模式

Indexer 可以以下方式使用

Indexer 添加的所有索引

不要在您的表上手动添加任何索引,而是让 Indexer 通过 try_indexes 和/或 try_composite_indexes 选项动态添加索引。通过这两个选项添加的索引将自动移除。

在此模式下,您实际上可以看到哪些索引工作得最好,而无需在表上实际应用它们。在这种情况下,您可以跳过使用try_table_indexes选项。

现有索引 + 由索引器添加的索引

您可能已经在您的表上有一些索引,但您想在不实际将它们添加到表中时尝试更多的索引。要指定表的现有索引,请使用前面提到的try_table_indexes选项。要尝试动态添加新索引,请使用try_indexes和/或try_composite_indexes选项。表的现有索引(在try_table_indexes中指定)将保持不变,但通过try_indexestry_composite_indexes添加的索引将自动删除。

现有索引

当您不希望索引器动态添加任何索引,并且您已经指定了表上的索引,您只想查看特定表的索引的EXPLAIN结果时,在这种情况下只需使用try_table_indexes选项。示例

'watched_tables' => [
    'users' => [
        'try_table_indexes' => ['email'],
    ],
    'posts' => [
        'try_table_indexes' => ['title'],
    ]
],

在这种情况下,email索引应已手动添加到表中。 · PHP 包仓库

无索引,仅显示所有SELECT查询的EXPLAIN结果

虽然前三种模式允许您与特定表和索引一起工作,但您可以使用此模式仅显示页面上运行的所有SELECT查询的EXPLAIN结果,而不添加任何动态索引。要使用此模式,只需不在watched_tables选项中指定任何表。如果您不希望将某些表包含在此模式中,请使用ignore_tables选项。

杂项

  • 如果索引器发现查询的EXPLAIN结果中有key存在(例如,查询实际上使用了键),则索引器底部右侧的框或结果内部查询部分的颜色将变为绿色。这可以通过在您的代码库中创建名为indexerOptimizedKeyCustom(array $queries)的自定义函数来更改,而不是默认的indexerOptimizedKey,该默认函数位于文件src/Helpers.php中。类似地,对于ajax请求,您应该定义自己的函数,名为indexerOptimizedKeyCustom(explain_result)。以下是每个函数的示例
// php
function indexerOptimizedKeyCustom(array $query): string
{
   return trim($query['explain_result']['key']);
}
// javascript
function indexerOptimizedKeyCustom(explain_result) {
    return explain_result['key'] && explain_result['key'].trim();
}

注意:如果索引器发现任何慢查询(通过slow_time选项启用),则底部右侧的框的颜色将始终是红色,直到您修复慢查询。

限制

  • 索引器试图在查询中的FROM关键字之后找到表名,因此它不能与复杂的查询或没有在FROM关键字之后包含表名的查询一起工作。

安全性

如果您发现任何安全相关的问题,请通过电子邮件sarfraznawaz2005@gmail.com而不是使用问题跟踪器。

鸣谢

许可协议

有关更多信息,请参阅许可文件