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

news/2025/3/14 22:53:52/

目录

简单介绍下两种引擎

开始实测

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

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

 MYISAM表结构

 Laravel的建表语句

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


简单介绍下两种引擎

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

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

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

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

开始实测

数据准备:

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

MYISAM表结构: 

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

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

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

 Laravel的建表语句

<?phpuse Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;class CreateApiRequestLogTable extends Migration
{public function up(){Schema::create('api_request_log', function (Blueprint $table) {$table->id();$table->unsignedBigInteger('user_id')->nullable()->default(0)->comment('admin_id');$table->string('user_name',50)->nullable()->default(0)->comment('admin_name');$table->string('method',10)->nullable()->default('')->comment('接口请求方式');$table->string('path')->nullable()->default('')->comment('接口地址')->index();$table->string('params',5000)->nullable()->default('')->comment('请求参数')->fulltext();$table->string('result',5000)->nullable()->default('')->comment('返回结果');$table->string('exec_time',10)->nullable()->comment('接口用时,单位秒');$table->text('sql')->default('')->nullable()->comment('执行的sql')->fulltext();$table->string('ip',15)->default('')->nullable()->comment('客户端IP');$table->timestamp('created_at')->useCurrent()->comment('创建时间');// $table->index('path');$table->engine = 'MyISAM';});DB::statement("alter table `api_request_log` comment '接口请求记录'");}/*** Reverse the migrations.** @return void*/public function down(){Schema::dropIfExists('api_request_log');}
}

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

<?phpnamespace App\Console\Commands;use App\Models\ApiRequestLog;
use Illuminate\Console\Command;class CleanApiLog extends Command
{protected $signature = 'api-log:clean {limit=300000}';protected $description = '清理接口请求记录表数据 可选参数limit来设置保留最新多少条数据(默认值是30万) ';public function __construct(){parent::__construct();}public function handle(){// 获取参数 保留多少条数据$limit = $this->argument('limit');$delete_count = $last_id = 0;// 获取最新数据的ID$last_id = ApiRequestLog::query()->latest()->value('id');if ($last_id){$end_id = $last_id - $limit; // 获取截止的IDif ($end_id > 0){$delete_count = ApiRequestLog::query()->where('id', '<', $end_id)->delete();}}$msg = '清理接口请求记录表数据:执行完成 limit='.$limit.',last_id='.$last_id.',delete_count='.$delete_count;info($msg);return $this->info($msg);}
}


http://www.ppmy.cn/news/1180311.html

相关文章

uniapp vue2、vue3 页面模板代码块设置

本文分享 uniapp vue2、vue3 页面模板代码块设置 设置路径 HBuilder X -> 工具 -> 代码块设置 -> vue代码块 -> 自定义代码块 如上图操作后在打开的 vue.json 文件的右侧“自定义代码块”中复制如下代码&#xff08;可全选替换也可添加到代码中&#xff09; 示…

使用香橙派并基于Linux实现最终版智能垃圾桶项目 --- 下

最终完成效果视频&#xff1a; 使用香橙派并基于Linux实现最终版带图像识别的可回收垃圾桶 — 下_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1bc411o7zS/?spm_id_from333.999.0.0&vd_source16380169fa415d2d056dd877a8d8c1b7 硬件接线 & 最终实现图 目录 …

折磨的Ts

先看下官网 这里的withDefault是给props设置默认值的 由于props传入了个函数在设置默认值的时候不知道怎么设置了 解决办法&#xff1a;直接不设置了。也不写了。

Redis进军磁盘存储

目录 1、对抗价格优势&#xff1a;纳入磁盘&#xff0c;降低成本&#xff1f; 2、Redis的野心&#xff1a;无敌是多么寂寞&#xff0c;所以我们要开新地图 3、开发者异议&#xff1a;他们正在偏离我们选择Redis的初衷 4、结语&#xff1a;性能为王&#xff0c;但绝不甘于只…

【广州华锐互动】VR公司工厂消防逃生演练带来沉浸式的互动体验

在工业生产过程中&#xff0c;安全问题始终是我们不能忽视的重要环节。特别是火灾事故&#xff0c;不仅会造成重大的经济损失&#xff0c;更会威胁到员工的生命安全。传统的消防安全训练方法&#xff0c;如讲座、实地演练等&#xff0c;虽然具有一定的效果&#xff0c;但是无法…

lunar-1.5.jar

公历农历转换包 https://mvnrepository.com/artifact/com.github.heqiao2010/lunar <!-- https://mvnrepository.com/artifact/com.github.heqiao2010/lunar --> <dependency> <groupId>com.github.heqiao2010</groupId> <artifactId>l…

【RTOS学习】软件定时器 | 中断处理

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《RTOS学习》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 软件定时器 | 中断处理 &#x1f3c0;软件定时器⚽守护任务守护任务的调度 ⚽使用软件定时器的函数…

vue中electron与vue通信(fs.existsSync is not a function解决方案)

electron向vue发送消息 dist/main.js (整个文件配置在另一条博客里) win new BrowserWindow({width:1920,height:1080,webPreferences: {// 是否启用Node integrationnodeIntegration: true, // Electron 5.0.0 版本之后它将被默认false// 是否在独立 JavaScript 环境中运行…