• MySQL日志类的数据表,实测MyISAM到底比InnoDB查询快多少


    目录

    简单介绍下两种引擎

    开始实测

    从数据占用的容量对比看MyISAM占用空间更小

    从查询效率对比看MyISAM也确实更快

     MYISAM表结构

     Laravel的建表语句

     Laravel定时任务-清理日志,只保留最新300万条记录


    简单介绍下两种引擎

    • InnoDB支持事务功能、外键、行级锁等一些关系数据库的高级功能。
    • MYISAM的性能更优,占用的存储空间少。

    两种存储引擎各有优劣,怎么选择要视具体应用而定。

    日志类的表只有添加和查询两种操作,业务简单,当然是要用MyISAM更合适。

    下面测试下查询和存储方面具体相差多少

    开始实测

    数据准备:

    1. InnoDB和MyISAM各创建一张表,分别导入十万条数据  
    2. 给`sql`字段创建全文索引

    MYISAM表结构: 

    1. 1CREATE TABLE `api_request_log` (
    2. `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    3. `user_id` bigint(20) unsigned DEFAULT '0' COMMENT 'admin_id',
    4. `user_name` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT 'admin_name',
    5. `method` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '接口请求方式',
    6. `path` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '接口地址',
    7. `params` varchar(5000) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '请求参数',
    8. `result` varchar(5000) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '返回结果',
    9. `exec_time` varchar(10) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '接口用时,单位秒',
    10. `sql` text COLLATE utf8mb4_unicode_ci COMMENT '执行的sql',
    11. `ip` varchar(15) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '客户端IP',
    12. `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    13. PRIMARY KEY (`id`),
    14. KEY `api_request_log_method_index` (`path`),
    15. FULLTEXT KEY `api_request_log_params_fulltext` (`params`),
    16. FULLTEXT KEY `api_request_log_sql_fulltext` (`sql`)
    17. ) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='接口请求记录';

     innodbdb表的实际数据和myisam表的数据是一样的,下图中显示的不准确

    1. 从数据占用的容量对比看MyISAM占用空间更小
    2. 从查询效率对比看MyISAM也确实更快

     Laravel的建表语句

    1. use Illuminate\Database\Migrations\Migration;
    2. use Illuminate\Database\Schema\Blueprint;
    3. use Illuminate\Support\Facades\Schema;
    4. class CreateApiRequestLogTable extends Migration
    5. {
    6. public function up()
    7. {
    8. Schema::create('api_request_log', function (Blueprint $table) {
    9. $table->id();
    10. $table->unsignedBigInteger('user_id')->nullable()->default(0)->comment('admin_id');
    11. $table->string('user_name',50)->nullable()->default(0)->comment('admin_name');
    12. $table->string('method',10)->nullable()->default('')->comment('接口请求方式');
    13. $table->string('path')->nullable()->default('')->comment('接口地址')->index();
    14. $table->string('params',5000)->nullable()->default('')->comment('请求参数')->fulltext();
    15. $table->string('result',5000)->nullable()->default('')->comment('返回结果');
    16. $table->string('exec_time',10)->nullable()->comment('接口用时,单位秒');
    17. $table->text('sql')->default('')->nullable()->comment('执行的sql')->fulltext();
    18. $table->string('ip',15)->default('')->nullable()->comment('客户端IP');
    19. $table->timestamp('created_at')->useCurrent()->comment('创建时间');
    20. // $table->index('path');
    21. $table->engine = 'MyISAM';
    22. });
    23. DB::statement("alter table `api_request_log` comment '接口请求记录'");
    24. }
    25. /**
    26. * Reverse the migrations.
    27. *
    28. * @return void
    29. */
    30. public function down()
    31. {
    32. Schema::dropIfExists('api_request_log');
    33. }
    34. }

    Laravel定时任务-清理日志,只保留最新30万条记录

    1. namespace App\Console\Commands;
    2. use App\Models\ApiRequestLog;
    3. use Illuminate\Console\Command;
    4. class CleanApiLog extends Command
    5. {
    6. protected $signature = 'api-log:clean {limit=300000}';
    7. protected $description = '清理接口请求记录表数据 可选参数limit来设置保留最新多少条数据(默认值是30万) ';
    8. public function __construct()
    9. {
    10. parent::__construct();
    11. }
    12. public function handle(){
    13. // 获取参数 保留多少条数据
    14. $limit = $this->argument('limit');
    15. $delete_count = $last_id = 0;
    16. // 获取最新数据的ID
    17. $last_id = ApiRequestLog::query()->latest()->value('id');
    18. if ($last_id){
    19. $end_id = $last_id - $limit; // 获取截止的ID
    20. if ($end_id > 0){
    21. $delete_count = ApiRequestLog::query()->where('id', '<', $end_id)->delete();
    22. }
    23. }
    24. $msg = '清理接口请求记录表数据:执行完成 limit='.$limit.',last_id='.$last_id.',delete_count='.$delete_count;
    25. info($msg);
    26. return $this->info($msg);
    27. }
    28. }

  • 相关阅读:
    HBase与Hive集成
    ABAP bgRFC 实例
    【Java】this、super关键字,代码块介绍
    计算机组成原理——数据的表示和运算②
    【MySQL 8】Generated Invisible Primary Keys(GIPK)
    Linux 常用命令介绍
    【Leetcode】 第387场周赛 — 题解
    黑猫带你学Makefile第3篇:Makefile基本语法
    Shell脚本-字符串
    双端链表LinkedList
  • 原文地址:https://blog.csdn.net/weixin_37689230/article/details/134077958