- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我计划从共享托管服务器切换到 AWS 设置(适用于 apache/php 的 EC2、适用于 MySQL 的 RDS)。
我的 php/mysql 网站的测试版在共享服务器上运行了一年多。特别是一个页面在浏览器中总是运行得很快(可能 < 3 秒即可完全加载)。
在准备迁移时,我将数据库和所有表从 MyISAM 更改为 InnoDB。我还将默认字符集切换为 utf8mb4(是 latin-1 或其他)并将排序规则切换为 utf8mb4_unicode_ci。有几个类似 varchar2(400) 的列被索引,出现 > 191 个字符错误(因为使用 utf8mb4 从 3byte->4byte 移动)。我进去并手动将这些列切换为 UTF-8/utf_unicode_ci。一切看起来都很好(没有明显的错误)
现在,我已将站点/数据库的副本移至 AWS。大多数页面加载良好。尤其是这个加载时间很长(> 5 分钟)。我有一些非常小的 EC2 实例和 RDS 实例,因此我意识到这可能是一个问题,但我是唯一使用该站点(用于一个查询)的人,并且整个数据库小于 70MB。
运行解释计划显示在大多数情况下使用键(索引?)以及一个具有 74k 行的“派生”表。 74k 是一个非常小的数据集。我对 Oracle 解释计划更加熟悉,因此我很难弄清楚发生了什么。
我尝试在共享托管服务器上运行原始页面,它也变得慢得多!因此,我没有理由相信这是 AWS 问题。
我知道MyISAM在简单场景下要快一点,但是它不可能比我新使用的InnoDB快10000000000000倍吧?
尝试对超过 191 个字符的 varchar 进行索引时,转换是否出现问题?有没有可能它只是以某种方式破坏了系统/表格?如果您给它们大量的时间,查询就会完成,但它们不可能这么慢。我认为即使索引被炸掉并且它对 74k 行进行全表扫描,它也不应该费力。
想法?
编辑:找到了这个线程: https://dba.stackexchange.com/questions/75091/why-are-simple-selects-on-innodb-100x-slower-than-on-myisam发帖人似乎也有类似的减速经历。我不能使用与他/她相同的解决方案。认为我必须将所有想要返回的列放入索引中是疯狂的。这不可能是大家都能接受的吧?
最佳答案
好吧,我明白了。是我的错(不足为奇)。我很久以前就写了这个查询,当时我才真正知道自己在做什么。绝对还有改进的空间......
查询看起来像这样:
TableA (main table of focus)
aID (pk)
bID (fk)
locationID (fk)
rowTitle
TableB
bID (pk)
locationID (fk)
TableLocations
locationID (pk)
locationName
我想基本上使用 A 的位置(如果存在),但如果 A 没有,则回退到 B 的位置。 (A 总是链接到 B)。
我正在做一些类似的事情
SELECT
rowTitle,
locationName
FROM
TableA a, TableB b, TableLocations loc
WHERE
a.bID = b.bID
AND
( a.locationID = loc.locationID
OR
(a.locationID IS NULL AND b.locationID = loc.locationID)
)
它运行良好,并且在使用 MyISAM 时总是返回我想要的内容。而且速度非常快。然而,当我由于某种原因转移到 InnoDB 时,sh$& 遇到了困难。不知道引擎在执行此查询的计划时有何不同。我想在某个时刻,当数据集足够大时,MyISAM 会被阻塞,但由于我仍处于 dev/uat 状态,数据很小。
此后我转向了结构更好的东西,例如:
SELECT
rowTitle
CASE WHEN loc1.locationID IS NOT NULL THEN loc1.locationName
WHEN loc2.locationID IS NOT NULL THEN loc2.locationName
END as locationName
FROM
TableA a
JOIN TableB b ON a.bID = b.bID
LEFT OUTER JOIN TableLocations loc1 ON a.locationID = loc1.locationID
LEFT OUTER JOIN TableLocations loc2 ON b.locationID = loc2.locationID
一切都很好!我删除了很多查询和其他表,以专注于我的主要逻辑/物理问题。
查询时间减少到大约 10MS,这正是我所期望的。
这是我对 MySQL 又爱又恨的一件事。有时“它确实有效”,让你审视自己的不足。绝对是我的错,因为第一次没有做对......
附加问题:如果有人知道 MyISAM 与 InnoDB 如何评估第一个(糟糕的)查询之间的差异以及为什么性能如此不同,我真的很想听听!
谢谢!
关于MyISAM -> InnoDB 并迁移到 AWS 后 mysql 查询变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41887382/
我有一个包含 21 个表的 mysql 数据库,所有表都有关系设置,我在 phpMyAdmin 中与设计师一起制作了它们。我很困惑,因为 MyISAM 不支持关系。除非有我找不到的更新。 是否有更新使
我有一个包含 MyISAM 和 InnoDB 表的 MyISAM 数据库,我想将此数据库迁移到另一台服务器,对于 MyISAM,只需复制 .frm .MYI 和 .MYD 即可,但对于 InnoDB
一:MySQL中MyISAM表损坏原因总结: 1、 服务器突然断电导致数据文件损坏;强制关机,没有先关闭mysql 服务;mysqld 进程在写表时被杀掉。 2、 磁盘损坏。 3、 服务器死机。
我必须维护一个使用 MyISAM 引擎的 MySQL 数据库。现在数据库太大,每天备份占用空间很大。 我从数据库中删除了数百万条记录,但数据库大小没有减少,备份文件大小更大。 我应该使用 OPTIMI
我正在测试 innoDB 表中的事务支持,出于好奇,我尝试在 MyIsam 表上运行相同的事务,令人惊讶的是它成功了。我假设在 myIsam 表上查询是一个接一个地执行,而不是在一个原子操作中执行,并
各位 我需要从表A(大约6000万条记录和myisam存储引擎)生成一个报告。表 A 每 15 分钟转储一次 cdr 文件。 我想根据(日期至)和(日期自)生成报告 我尝试过的几个场景如下 1)我尝试
我在 Windows Server 2008(具有 4GB RAM)上使用 MySQL 5.1,并具有以下配置: 我有 2 个 MyISAM 表。其中一个位于 1 个数据库 (DB1) 中,有 14
我试图在 MariaDB10.0.14 上执行基准测试,以使用多个线程读取 MyISAM 表上的数据,但我不断收到与主键重复条目有关的异常。 MyISAM支持多线程读取吗?我使用sysbench进行基
我有一台具有 4GB RAM 和 400MB Mysql 数据库 (Myisam) 的单处理器专用服务器,该服务器存在很大的性能问题。该数据库由电子商务使用。我已经尝试使用 mysqltuner 脚本
多线程如何与 MyISAM 配合使用。因为它支持表级锁定?如果我们要求从同一张表中选择。线程在这种情况下如何工作 最佳答案 单独的连接获得单独的线程。单个连接不会使用多个线程。 (MyISAM 和 I
我有以下 2 个相同的表,使用 MySQL: DROP TABLE IF EXISTS `DB`.`tblNew`; CREATE TABLE `DB`.`tblNew` ( `NumberPK`
我可能忽略了一些简单的事情,但几周来我一直在试图了解这里出了什么问题,我需要一双新的眼睛。 我有一个处理 Paypal 付款通知的 CGI 应用程序。当有人订阅时,我实际上会获得一个订阅 IPN,然后
表不断崩溃错误 126 (HY000):表 './DB/Table.MYI' 的 key 文件不正确;尝试修复它 它确实通过修复表修复了,但问题再次出现!而且它的 5G 表需要约 45 分钟才能修复。
我可以使用在 MySQL 5.1.30 上运行的 MyISAM 表创建表空间吗? 最佳答案 表空间(在 MySQL 5.1 中)仅支持 NDB 和 NDBCLUSTER,参见 http://dev.m
基本上,我有一个 lang 表,其中包含 pg VARCHAR(20),id VARCHAR(20),en ( TEXT),ru (TEXT) 用于我的网站的多语言支持,在 99.999% 的情况下,
我的在线拍卖网站已经运行了近 3 年,并且仍然运行良好。三年内,如此多的拍卖已在服务器上列出并完成。但现在有很多负载在服务器上,因为数据库服务器上有很多已完成的现场拍卖。因此网站的性能不再是以前的样子
在 Mysql(5.7 及以上版本)中,用于表的更改跟踪,this approach实现起来非常简单。 但它需要版本表是 MyISAM,它执行表级锁定。 这种方法对于每秒发生多次插入/更新的生产系统是
假设我在 MyISAM 表上进行了一些操作(让它成为 INSERT),并附加了触发器。 我知道 MySQL 在运行此 INSERT 时会执行隐式表锁定。 问题:触发器会在这个隐式锁内部运行吗?触发器中
我有两个表,t1 和 t2,每个表有两列 - id_user 和 age。 如何将 t1.age 更新为 t1.age 和 t2.age 中的最大值以匹配 ID,并保留 t1.age 如果 t2 中没
我有一张测试表。测试表如下: CREATE TABLE `mytest` ( `num1` int(10) unsigned NOT NULL, KEY `key1` (`num1`) )
我是一名优秀的程序员,十分优秀!