AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 14006
Accepted
Haluk
Haluk
Asked: 2012-02-28 08:57:06 +0800 CST2012-02-28 08:57:06 +0800 CST 2012-02-28 08:57:06 +0800 CST

Innodb 更新性能

  • 772

我们最近将我们的一张表切换到了 innodb,现在我们正在经历非常缓慢的 UPDATE 执行时间。过去需要 0.010-0.030 秒的更新现在可能需要超过 70 秒。一些查询被丢弃是因为它们无法在默认的 50 秒限制内获得锁(我意识到我们可以提高这个限制)。

有问题的表只有一个索引,主键本身是一个 mediumint 值。该表有大约 100 万行。此上下文中的所有 UPDATE 都涉及单行。通常,该行中的 4-5 列在每个查询中都会受到影响。

当前的 my.cnf 粘贴在下面。您是否看到任何可能特别导致 innodb 更新性能不佳的内容?

[mysqld]
set-variable=local-infile=0

datadir=/db/mysql/data
socket=/var/lib/mysql/mysql.sock
#log = /var/log/mysqld.log
log-error = /var/log/mysqld.error.log
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1


skip-locking
key_buffer = 1G
query_cache_size = 256M
thread_cache_size = 128
table_cache = 2048
max_connections = 400
query_cache_limit = 1024M
log_slow_queries = /var/log/mysql-slow.log
long_query_time = 1
skip-bdb
skip-locking
skip-name-resolve

innodb_buffer_pool_size=1G
innodb_additional_mem_pool_size=20M
innodb_flush_log_at_trx_commit=2
#innodb_log_file_size=250M
innodb_log_buffer_size=8M
innodb_lock_wait_timeout=50


[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

更新:
innodb_log_file_size: 5242880
have_innodb: YES
"WHERE" 子句总是只查找一列,这是主键。

更新 - 2012 年 7 月 26 日:
我们将数据库升级到 mysql 5.5。现在 innodb 更新非常快,在我们的特定情况下不到 0.010 秒。而且,方差非常低。我对此的看法是:在 mysql 5.0 上应谨慎使用 innodb。

mysql performance
  • 2 2 个回答
  • 14108 Views

2 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2012-02-28T09:54:34+08:002012-02-28T09:54:34+08:00

    观点#1

    当您仅在 InnoDB 中按主键更新时,聚集索引(又名gen_clust_index)可能会被锁定,这是一种罕见但可能的情况。

    我曾经回答过一个人关于这个主题的三个帖子

    • 无法破译 innodb 状态日志中的死锁
    • 偶尔慢查询的原因?
    • 这两个查询如果按顺序执行会导致死锁吗?

    请仔细阅读这些内容。这些问题的发布者根据看到的 InnoDB Clustered Index Locking 行为找到了自己的解决方法。可悲的是,他没有发布解决方法是什么。

    此外,当您看到查询运行缓慢时,登录 mysql 并运行SHOW ENGINE INNODB STATUS\G并开始在聚集索引中查找锁。

    观点 #2

    我看到你注释掉了innodb_log_file_size。默认为 5MB。由于innodb_buffer_pool_size设置为 1G,因此 innodb_log_file_size 需要为 256M。单击此处将 innodb_log_file_size 设置为 256M。

    观点#3

    我看到您没有使用innodb_file_per_table。您可能希望使用它来专门为具有一百万行的一个表完成表更新。单击此处查看如何清理 InnoDB 基础架构以使用 innodb_file_per_table。

    • 2
  2. Stephen Senkomago Musoke
    2012-02-28T10:24:00+08:002012-02-28T10:24:00+08:00
    1. 您是否正在更新主键值的值?

    2. 任何列是否是其他表的外键?由于 InnoDB 还通过 CASCADE 更新同一事务中的外键。

    3. 你能否将 innodb_buffer_pool_size 增加到 1GB 以上,以便整个表可以放入内存中?

    4. schmea 中有多少其他表 - 因为可能存在调整表空间大小以执行更新的问题

    5. 您可能想尝试使用为每个表创建表空间文件的 innodb_file_per_table。更改此参数后,您需要重新启动服务器,然后重新创建数据库以使其生效。

    • 0

相关问题

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve