相关疑难解决方法(0)

查询在一些较新的 MySQL 版本中运行时间较长

我在 MySQL 5.0.15 上创建了一个数据库。我有一个查询,当我在这个 MySQL 版本上运行这个查询时,我得到 0.9 秒的运行时间。当我将此数据库导入到另一个具有相同硬件的 MySQL 服务器并运行相同的查询时,我得到了 120 多个,有时 MySQL 挂起。

5.0 和 5.1 或 5.5 有什么区别?我已经测试了 5.1 和 5.5 版本。

在较新版本中查询是否可能需要更长的时间(例如 mysql 结构更改)?

对不起,我不能把这个查询放在这里,但查询是这样的:

SELECT fl_passenger_ticket. *, 
       fl_aganc.name                             AS agancname, 
       fl_pnr.remark                             AS remark, 
       fl_pnr.reservetime                        AS reservetime, 
       fl_pnr.cancelpnr, 
       fl_flight_date.fromcity                   AS fromcity, 
       fl_flight_date.tocity                     AS tocity, 
       fl_flight_date.flightdate                 AS flightdate, 
       fl_flightdate_capacity.adultper           AS adultper, 
       fl_flightdate_capacity.childper           AS childper, 
       fl_flightdate_capacity.infantper          AS infantper, 
       fl_flightdate_capacity.cancel             AS cancelsegment, 
       fl_flightdate_capacity.tax1adultpric, 
       fl_flightdate_capacity.tax1childpric, 
       fl_flightdate_capacity.tax1infantpric, 
       fl_flightdate_capacity.tax2adultpric, 
       fl_flightdate_capacity.tax2childpric, 
       fl_flightdate_capacity.tax2infantpric, 
       ( fl_flightdate_capacity.tax3adultpric + 
         fl_flightdate_capacity.tax4adultpric + 
         fl_flightdate_capacity.tax5adultpric )  AS taxxtadultpric, 
       ( fl_flightdate_capacity.tax3childpric + …
Run Code Online (Sandbox Code Playgroud)

mysql innodb mysql-5.5 mysql-5.1 mysql-5.0

6
推荐指数
2
解决办法
9670
查看次数

我应该使用 MyISAM 以外的存储引擎来优化这些表还是应该获得更好的磁盘?

我正在开发一个生产数据库,它的 4 个最大的表每个包含 400 万到 1000 万行,每个包含大约 15 个字段,并在不同的字段类型(数字、varchar 和文本)上有索引。总index_length容量为 2.2GB,总容量data_length为 6GB。所有这些表都使用 MyISAM,它们的读/写比为 66/33。

这是空闲时间 /etc/init.d/mysql status 的输出:

Server version          5.1.37-1ubuntu5
Protocol version        10
Connection              Localhost via UNIX socket
UNIX socket             /var/run/mysqld/mysqld.sock
...

Threads: 27  Questions: 5430994  Slow queries: 59  Opens: 298  Flush tables: 1  Open tables: 128  Queries per second avg: 182.695
Run Code Online (Sandbox Code Playgroud)

在高峰时段,每秒的查询数约为 300。

在过去的几周里,数据库变得如此缓慢,有时查询会锁定 2 分钟以上。所以,我增加到key_buffer_size4GB(我机器上有 8GB)。锁定时间减少了。但是在高峰时段还是难以忍受,尤其是读写比接近50/50的时候。

服务器在虚拟环境中运行,因此 I/O 不是很好,并且大多数选择查询ORDER BY <some_indexed_field>在平均 50k 行的结果集上执行。

之前我已经成功地调整了这个数据库,但现在它仍然较小,但现在我被卡住了。

更新: 白天磁盘利用率很容易达到 100%。

mysql myisam database-tuning

5
推荐指数
1
解决办法
1138
查看次数

mysqldump 与 LOAD DATA INFILE

为什么要使用 mysqldump 来重新填充表而不是加载数据文件?

这是我的问题的背景故事。我们有一个表的分区不正确。它应该按 PK 划分为 10M 行块。在 90M => 100M 之后,它开始被分区为 100M 行块(100M=>200M 等)。

最近的分区之间有 135M 行,我们决定是时候花一些停机时间来解决这个混乱的问题了。

游戏计划基本上是:

1) mysqldump >= 100M

2) 删除分区 >= 100M

3)创建所需的分区范围

4)通过mysqldump文件读取

这些转储以 10M 块的形式完成,因此我们可以同时重新加载到已关闭的主服务器和从服务器中,并在两者之间进行一些健全性检查,这样我们就不会在意识到自己被搞砸之前走得太远。这是一个仅附加的表,不会发生变化,因此我们能够在真正的停机时间开始之前提前完成历史转储并 scp 到本地副本。因此,我们添加了 --skip-disable-keys,因为我们的 mysql 版本不允许您对每个分区执行此操作,并且不想在每个块之后连续重建,因此这可能与性能差异有关正要布置呢

之前的一些基准测试给我们留下了估计 90 分钟的停机时间。我们错了;mysqldump 重新加载的时间比预期长约 3-4 倍。

我们有一些时间闲逛。应急计划的一部分是在主分区和其他所有分区都重建之前不要丢弃其中一个从分区,“以防万一”。在重建过程中,我们决定进行一个测试,从未触及的从属设备中为我们尚未到达的某些段选择 * 到输出文件中,然后重新加载这些数据文件。

我们制作了转储,对其进行了 gzip 压缩,并将其复制到正在重建过程中的机器上。为了节省一些必须解压缩然后再次读取的开销,我们将其 gzip -dc 放入命名管道中,然后从其中加载。

加载数据方法大约在 4 分钟/块内完成,而不是 mysqldump 重新加载所需的 12-15 分钟。

我知道手册说这对于较大的负载来说可能会更快,但这让我苦苦思索,如果我们的模式已经就位,为什么我们应该使用 mysqldump?

PS 我知道重新组织分区,但发现过去将转储/重新加载到 alteeed 模式中的性能更高。

mysql mysqldump partitioning

5
推荐指数
1
解决办法
6683
查看次数

我有 16GB 的内存,我应该如何配置 MySQL 服务器?

我有一台带有多个 CPU 和 16GB RAM 的专用生产服务器。

如何配置它以利用服务器资源以获得更好的性能?网站流量不断增加,MySQL 开始使用大量 CPU。

这是我当前的MySQL 服务器配置

我还计划优化数据库,并检查查询以改善缓慢的查询。

mysql memory configuration

5
推荐指数
1
解决办法
2万
查看次数

5
推荐指数
1
解决办法
2605
查看次数

超线程和 MySQL InnoDB 线程并发性能

我有一个具有以下规格的专用数据库服务器”

  • Ubuntu 12.04 LTS 服务器
  • 英特尔(R) 至强(R) CPU X5670
    • @ 2.93GHz
    • 12核
  • MySQL 5.5.29
  • 64 GB 内存
  • RAID10

我们目前正在做超线程,所以我们有 24 个逻辑核心。目前在 2k-4k 事务/秒之间运行。

我已经设置了以下内容:

  • innodb_thread_concurrency = 48
  • innodb_read_io_threads = 24
  • innodb_write_io_threads = 24

这是严格的 OLTP 负载(70% 读取)。查询速度相对较快(毫秒)。查询缓存已开启但未使用过多。临时磁盘表不经常创建。InnoDB 缓冲池设置为 48GB,几乎涵盖了整个数据集(60GB 数据+索引)。

  • 事务负载将翻倍至 4k-8k 事务/秒。目前 CPU 负载约为 1000%,所以我预计这将是瓶颈。

如何更好地调整 CPU 线程以及 MySQL 如何使用这些线程?让我知道是否有人对innodb_thread_concurrency.

我将不胜感激任何建议。


更新

innodb_thread_concurrency = 48到更新后:

  • innodb_thread_concurrency = 0

在高峰时间(4-5k 事务/秒)的生产系统上查看行为,这是我观察到的:

  • 负载平均增加
  • mysqld 进程 CPU 使用率从 400% - 1000% 上升到 400% - 1400%
  • 大约 4-10 个 …

mysql innodb performance linux mysql-5.5 performance-tuning

5
推荐指数
1
解决办法
3万
查看次数

MySQL读取联合表时读取通信数据包超时

我有两台服务器(所罗门和宁静)。
两台服务器都是 Windows Server (2012 & 2016)、IIS、PHP (5.6.31)、MySQL (5.5)。

在所罗门上,我设置了几个联合表,指向宁静表。我在 solomon 上设置了一个用户,专门用于连接到这些联合表。

帐户分布在两台服务器上。我的用户帐户一半在 solomon 上,一半在 serenity 上。但是,所有用户的登录页面都很平静。这是为了让 serenity 服务器可以检查该用户应该被定向到哪个服务器,然后重定向到 solomon 或 serenity 上的密码页面。所以通过这种方式,所有用户都经历了宁静,但并非所有用户都留在那里。

但是,在 solomon 上运行的其他一些脚本确实会检查这些联合表,因此即使用户已经通过 solomon,该站点仍在查询这些联合表,从而达到了平静。

据我所知,这应该不是问题,但在平静中我在 mysqlerror.log 中收到很多警告,如下所示:(用户名、数据库名和 IP 地址被混淆)

180430 16:21:00 [Warning] Aborted connection 24784 to db: 'dbname_blah' user: 'federated_user_blah' host: 'xxx.xxx.xx.xx' (Got timeout reading communication packets)
Run Code Online (Sandbox Code Playgroud)

在所罗门我没有收到这些警告。此外,这些警告中有 95% 提到了联合用户,即使我 99% 的查询是使用不同的用户完成的。所以这就是为什么我怀疑这是联合表/用户的问题。

我不会太担心,除了我在宁静方面遇到了很多问题,我怀疑这可能与此有关。今天我的数据库崩溃了,我不得不重新启动服务器。很多愤怒的顾客。

其他症状

在过去的几个月里,我遇到了似乎是并发连接限制的问题,因为我有几个脚本循环遍历多行数据(通常在 50 到 200 之间)并使用 ajax 为每一行调用发送电子邮件脚本,或者在另一种情况下计算小时数。有时,这些循环脚本不会执行循环中的所有调用,而是会以 500 个错误结束,特别是当循环中有很多行(比如超过 100 行)时。较小的循环(如 50 条记录)通常没有问题。

然而,根据微软的说法,IIS 中不再有任何并发​​连接限制。

网站上的超时 有时并非我的所有 sql 语句都能够在页面加载时完成执行。他们只是超时并且不返回任何行。然后当我刷新页面时,它们通常会加载,但如果加载时间超过几秒钟,我知道会有一些语句超时。

MySQL Workbench 中的超时 如果我尝试 …

mysql

5
推荐指数
1
解决办法
3万
查看次数

Mysql 内存表获得很多锁

在我的网站上,我在一个简单的 mysql 表中记录每个综合浏览量(日期、IP、引用、页面等)。

该表具有以下活动:

  • SELECT每分钟1个
  • DELETE每分钟1个
  • 没有UPDATE查询
  • 很多INSERTS(大约每秒 300 个)。

该表永远不会大于 200MB。

今天,我将这个表从 InnoDB 表更改为 MEMORY 表,这对我来说是有意义的,以防止不必要的硬盘 IO。我还每分钟修剪一次这张桌子,以确保它永远不会变得太大。而且这个信息不是很重要,所以在 MySQL 重启时删除它并不重要。

——

性能方面,一切都运行良好。但是我注意到在运行 tuning-primer 时,使用 MEMORY 表时我的当前锁定等待率非常高。

Current Lock Wait ratio = 1 : 561
Run Code Online (Sandbox Code Playgroud)

如果我将此表更改为 InnoDB,则比率为:

Current Lock Wait ratio = 0 : 78600946
Run Code Online (Sandbox Code Playgroud)

我的问题:我应该担心这个锁定等待率吗?有什么我可以改变我的配置来改进的东西,以便使用 MEMORY 表的锁定等待率不会那么高?

mysql innodb optimization memory

4
推荐指数
1
解决办法
6400
查看次数

MySQL 高 CPU 使用率(MyISAM 表索引)

我有一个继承的 MySQL 数据库的问题。mysqld 有时会使用高达 2300% 的 CPU。唯一的解决方案是服务 mysql stop 并在表上运行 myisamchk -r。修复索引后,我启动 MySQL,一切正常。

关于永久解决方案的任何想法?

编辑(来自评论):

使用 5.5.29-0ubuntu0.12.04.2-log

key_buffer = 16M 
max_allowed_pa​​cket = 16M 
线程堆栈 = 128K 
线程缓存大小 = 8 
myisam-recover = 备份 
最大连接数 = 500 
#table_cache = 512 
#thread_concurrency = 10 
query_cache_limit = 1M 
query_cache_size = 16M 
SELECT SUM(index_length) ndxsize 
FROM information_schema.tables 
WHERE engine='MyISAM'
Run Code Online (Sandbox Code Playgroud)

返回

+-----------+ 
| ndxsize |
+-----------+
| 59862016 |
+-----------+ 
SELECT SUM(data_length+index_length)/power(1024,2) datndxsize 
FROM information_schema.tables 
WHERE engine='MyISAM'
Run Code Online (Sandbox Code Playgroud)

返回:

+--------------------+ 
| 数据大小 |
+--------------------+
| 488.69915199279785 | …

mysql myisam

3
推荐指数
1
解决办法
7520
查看次数

为 MySQL 使用超过 4 个 CPU 是否有好处?

我们在 Linux 上的 VMWare 下运行 MySQL 5.5,在 2 个 CPU 上运行。我们计划将其增加到 4,但我们有未使用的 CPU,我想知道将数量增加到 8 是否有任何好处?

mysql innodb mysql-5.5 vmware

3
推荐指数
1
解决办法
3535
查看次数