sarfraznawaz2005 / indexer
Laravel 包,用于监控 SELECT 查询并提供最佳索引字段。
Requires
- php: >=7.0
- doctrine/dbal: ^2
- illuminate/support: ~5|~6|~7|~8
README
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
配置文件。
截图
启用时,您将在右下角看到黄色/绿色/红色框
- 默认为黄色或当查询需要优化时
- 当总查询数与优化查询数匹配时为绿色
- 当发现一个或多个慢查询并需要优化时为红色
配置
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_indexes
,try_composite_indexes
也可以用于动态地向数据库表添加复合索引。在这种情况下,由name
和email
组成的复合索引将由 Indexer 动态添加,并展示该索引的性能。
模式
Indexer 可以以下方式使用
Indexer 添加的所有索引
不要在您的表上手动添加任何索引,而是让 Indexer 通过 try_indexes
和/或 try_composite_indexes
选项动态添加索引。通过这两个选项添加的索引将自动移除。
在此模式下,您实际上可以看到哪些索引工作得最好,而无需在表上实际应用它们。在这种情况下,您可以跳过使用try_table_indexes
选项。
现有索引 + 由索引器添加的索引
您可能已经在您的表上有一些索引,但您想在不实际将它们添加到表中时尝试更多的索引。要指定表的现有索引,请使用前面提到的try_table_indexes
选项。要尝试动态添加新索引,请使用try_indexes
和/或try_composite_indexes
选项。表的现有索引(在try_table_indexes
中指定)将保持不变,但通过try_indexes
和try_composite_indexes
添加的索引将自动删除。
现有索引
当您不希望索引器动态添加任何索引,并且您已经指定了表上的索引,您只想查看特定表的索引的EXPLAIN
结果时,在这种情况下只需使用try_table_indexes
选项。示例
'watched_tables' => [ 'users' => [ 'try_table_indexes' => ['email'], ], 'posts' => [ 'try_table_indexes' => ['title'], ] ],
在这种情况下,email
和
无索引,仅显示所有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
关键字之后包含表名的查询一起工作。
安全性
如果您发现任何安全相关的问题,请通过电子邮件
鸣谢
许可协议
有关更多信息,请参阅许可文件。