laravel-soar - 自動監控輸出 SQL 優化建議、輔助 laravel 應用 SQL 優化。
原始碼
https://github.com/guanguans/laravel-soar
功能
- 支援啟發式演算法語句優化建議、索引優化建議
- 支援 EXPLAIN 資訊豐富解讀
- 自動監控輸出 SQL 優化建議
- Debug bar、Soar bar、JSON、Clockwork、Console、Dump、Log、自定義輸出器(多種場景輸出)
- 支援查詢構建器生成 SQL 優化建議
安裝
$ composer require guanguans/laravel-soar --dev -vvv
配置
註冊服務
laravel
$ php artisan vendor:publish --provider="Guanguans\\LaravelSoar\\SoarServiceProvider"
lumen
將以下程式碼段新增到 bootstrap/app.php
檔案中的 Register Service Providers
部分下:
$app->register(\Guanguans\LaravelSoar\SoarServiceProvider::class);
使用(示例程式碼)
自動監控輸出 SQL 優化建議
- Json 響應(完整示例)
{
"message": "ok",
"soar_scores": [
{
"Summary": "[☆☆☆☆☆|0分|3.56ms|select * from `users` where `name` = 'soar' group by `name` having `created_at` > '2022-04-19 18:24:33']",
"HeuristicRules": [
...
{
"Item": "GRP.001",
"Severity": "L2",
"Summary": "不建議對等值查詢列使用 GROUP BY",
"Content": "GROUP BY 中的列在前面的 WHERE 條件中使用了等值查詢,對這樣的列進行 GROUP BY 意義不大。",
"Case": "select film_id, title from film where release_year='2006' group by release_year",
"Position": 0
},
...
],
"IndexRules": [
{
"Item": "IDX.001",
"Severity": "L2",
"Summary": "為laravel庫的users表新增索引",
"Content": "為列name新增索引;為列created_at新增索引; 由於未開啟資料取樣,各列在索引中的順序需要自行調整。",
"Case": "ALTER TABLE `laravel`.`users` add index `idx_name_created_at` (`name`(191),`created_at`) ;\n",
"Position": 0
}
],
"Explain": [],
"Backtraces": [
"#13 /app/Admin/Controllers/HomeController.php:74",
"#55 /Users/yaozm/Documents/develop/laravel-soar/src/Http/Middleware/OutputSoarScoreMiddleware.php:45",
"#76 /public/index.php:55",
"#77 /server.php:21"
]
},
...
]
}
- Soar bar
- Debug bar
- Clockwork
- Console
- Dump
- Log
- 自定義輸出器
實現該介面
<?php
namespace Guanguans\LaravelSoar\Contracts;
use Illuminate\Support\Collection;
interface Output
{
public function output(Collection $scores, $dispatcher);
}
config/soar.php
檔案中配置輸出器即可
<?php
return [
...
'output' => [
// \Guanguans\LaravelSoar\Outputs\ClockworkOutput::class,
// \Guanguans\LaravelSoar\Outputs\ConsoleOutput::class,
// \Guanguans\LaravelSoar\Outputs\DumpOutput::class => ['exit' => false],
\Guanguans\LaravelSoar\Outputs\JsonOutput::class,
\Guanguans\LaravelSoar\Outputs\LogOutput::class => ['channel' => 'daily'],
\Guanguans\LaravelSoar\Outputs\DebugBarOutput::class,
\Guanguans\LaravelSoar\Outputs\SoarBarOutput::class,
],
...
];
Soar 例項及方法
soar(); // 獲取 Soar 例項
app('soar'); // 獲取 Soar 例項
/**
* Soar 門面.
*
* @method static string score(string $sql) // SQL 評分
* @method static array arrayScore(string $sql) // SQL 陣列格式評分
* @method static string jsonScore(string $sql) // SQL json 格式評分
* @method static string htmlScore(string $sql) // SQL html 格式評分
* @method static string mdScore(string $sql) // SQL markdown 格式評分
* @method static string explain(string $sql) // explain 解讀資訊
* @method static string mdExplain(string $sql) // markdown 格式 explain 解讀資訊
* @method static string htmlExplain(string $sql) // html 格式 explain 解讀資訊
* @method static null|string syntaxCheck(string $sql) // 語法檢查
* @method static string fingerPrint(string $sql) // SQL 指紋
* @method static string pretty(string $sql) // 格式化 SQL
* @method static string md2html(string $sql) // markdown 轉 html
* @method static string help() // Soar 幫助
* @method static null|string exec(string $command) // 執行任意 Soar 命令
* @method static string getSoarPath() // 獲取 Soar 路徑
* @method static array getOptions() // 獲取 Soar 配置選項
* @method static Soar setSoarPath(string $soarPath) // 設定 Soar 路徑
* @method static Soar setOption(string $key, $value) // 設定 Soar 配置選項
* @method static Soar setOptions(array $options) // 批量設定 Soar 配置選項
*
* @see \Guanguans\SoarPHP\Soar
* @see \Guanguans\LaravelSoar\Soar
*/
class Soar{}
查詢構建器方法
namespace Illuminate\Database\Eloquent {
/**
* @method string toRawSql()
* @method void dumpRawSql()
* @method void ddRawSql()
* @method array toSoarArrayScore()
* @method void dumpSoarArrayScore()
* @method void ddSoarArrayScore()
* @method string toSoarJsonScore()
* @method void dumpSoarJsonScore()
* @method void ddSoarJsonScore()
* @method string toSoarHtmlScore()
* @method void echoSoarHtmlScore()
* @method void exitSoarHtmlScore()
* @method string toSoarHtmlExplain()
* @method void echoSoarHtmlExplain()
* @method void exitSoarHtmlExplain()
*
* @see \Guanguans\LaravelSoar\Support\Macros\QueryBuilderMacro
*/
class Builder
{
}
}