我做了擦拭和恢复.
我尝试做:
ALTER TABLE xxx ENGINE = innodb;
并且它对任何表都没有任何作用.
"显示表状态"仍然是"MyISAM"
mysql> alter table auth_user_user_permissions engine=innodb;
Query OK, 0 rows affected, 1 warning (0.06 sec)
Records: 0 Duplicates: 0 Warnings: 0
+------------+----------+----------------------------------------------------------------+
| Engine | Support | Comment |
+------------+----------+----------------------------------------------------------------+
| MyISAM | DEFAULT | Default engine as of MySQL 3.23 with great performance |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables |
| InnoDB | DISABLED | Supports transactions, …Run Code Online (Sandbox Code Playgroud) 非常直截了当的问题.
出于几个原因,我将InnoDB用于其他一切.对于"高流量"的桌子来说,它是否超过MyISAM的性能?
我有一个大的MySQL表(~10万行,6.5G)我用它来读写.这是MyISAM,由于MyISAM对写入的所有表锁定,我得到了很多锁.
我决定尝试转移到推荐用于读/写表的InnoDB,它只锁定写入时的特定行.
转换后,我测试了插入语句,结果表明它在InnoDB表中比在MyISAM表中多花了15倍(从0.1秒到1.5秒).这是为什么?
我还没有为InnoDB配置任何东西,并且还计划添加分区,但这个数字对我来说仍然是出乎意料的.当然表是相同的,相同的索引等.
根据要求提供的其他信息:
2个索引.primary是Big INT类型的data_id,varchar(255)类型的非唯一user_id.
插入大约有150行,具有相同的user_id.
索引大小:MyISAM为200 MB,InnoDB为400 MB
我们有一个Laravel应用程序(版本5.4.18),它连接到MySQL(5.6.38)数据库(总共300k行),MyISAM类型.我们有api-response之类的Model::with('anothermodel')->paginate(25),并且在某些时候这个查询的执行时间已达到18秒,这是非常大的价值.我创建了一个沙盒,其中包含使用exaclty相同数据库(在同一服务器上)的副本的实时laravel环境,现在这个api-response在2.5秒内执行.如果我们尝试将沙盒laravel连接到实时DB,那么api执行再次是18s.请检查图像.
因此,如果我们假设问题出现在实时网站的数据库表中,但如果我们尝试用这个查询来衡量microtime,那么它将显示生成此查询并从数据库中获取数据所需的时间仅为0.7秒.
因此,如果我们假设问题出现在API路由或Laravel代码中,但是如果我只是将其复制到子目录(作为沙箱),那么执行相同的代码没有任何问题.
有任何想法吗?
还有一些服务器信息:Linux服务器上的PHP 7.0.29,内存为32GB.
我的一个项目在MySQL中使用MyISAM引擎,但我正在考虑将其更改为InnoDB,因为我需要事务支持.
有时我被问到一些采访:InnoDB对MyISAM有什么好处,MyISAM比InnoDB好?关于问题的第一部分,一切都很清楚:InnoDB是交易兼容的,行级阻塞而不是表级阻塞,外键支持和其他一些,这些点只是浮现在脑海中.
但是当MyISAM真的比InnoDB好吗?
这可能是一个问题,我失去了更多的时间来思考如何做到正确,思考以最佳的优化方式去做.
我有一个表"内容",并且需要添加选项以将多个"hashtags"或"tags"或"keywords"关联到内容,例如,像"Fried potatos with ketchup"这样的内容具有"键": "土豆","番茄酱"和"炒".
当我用一个单词进行搜索时,例如"马铃薯",我需要显示其中的内容标记这个单词.
问题是,它的最佳结构是什么,考虑结果的速度,因为内容表是MyISAM mith超过30 Millon行.
我想在这:
再添2个表,"contents_hashtags" (id(INT11), content_id(INT11), hashtag_id(INT11))和"hashtags" (id(INT11), hashtag(VARCHAR(40)))InnoDB中的2个表
当用户创建/修改表格内容时,我在hashtags表中搜索并获取ID,如果不存在的标签,则在表格标签中创建它,如果存在,则获取ID,使用此ID创建插入在表contents_hashtas中关联内容<-contents_hashtas-> hashtahs
在搜索中,使JOINS(LEFT/RIGHT/INNER dude ..)并通过LIKE进行搜索?通过exact(hashtag ="XXX")或FULL TEXT SEARCH?
这种方法是正确/快速的吗?我不知道如何以大排量和大流量来运行它.
myisam ×10
mysql ×9
innodb ×7
database ×3
performance ×2
php ×2
amazon-rds ×1
laravel ×1
locking ×1
mysqli ×1
optimization ×1
session ×1
sql ×1