laravel-soar(2.x) - 自動監控輸出 SQL 優化建議、輔助 laravel 應用 SQL 優化

guanguans發表於2022-04-20

laravel-soar - 自動監控輸出 SQL 優化建議、輔助 laravel 應用 SQL 優化。

原始碼

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 優化建議

{
    "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
    {
    }
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結
No practice, no gain in one's wit. 我的 Gitub

相關文章