Questions tagged «innodb»

InnoDB:MySQL的符合ACID的存储引擎

2
innodb_flush_method = O_DIRECT与O_DSYNC性能对具有LVM磁盘分区的ext3的影响
在我的一个生产环境中,我们有两个实例在RedHat集群上运行,并且一个生产实例与该集群相关联。 我们有125G主内存,instance1占用了24G InnoDB缓冲池,instance2占用了12G,这与RedHat集群无关。数据日志和事务日志都位于带有ext3文件系统的LVM磁盘分区上。 为了提高性能和提高I / O吞吐量,我决定更改innodb_flush_method为O_DIRECT。 参考MySQL文档: InnoDB数据和日志文件位于SAN上的位置,已发现将设置innodb_flush_method为O_DIRECT可以使简单SELECT语句的性能降低三倍。 提到高性能MySQL Ver 2和3,它指出InnoDB开发人员使用发现了错误innodb_flush_method=O_DSYNC。O_SYNC并且O_DSYNC类似于fsync()和fdatasync():O_SYNC同步数据和元数据,而O_DSYNC仅同步数据。 如果所有这些看起来都像是在没有任何建议的情况下进行很多解释,则以下是建议: 如果您使用类似Unix的操作系统,并且您的RAID控制器具有备用电池的写缓存,则建议您使用O_DIRECT。如果不是,则默认设置或O_DIRECT将是最佳选择,具体取决于您的应用程序。 谷歌搜索,我得到这个基准测试报告:在O_DSYNCVSO_DIRECT 基准报告: =================== 1B行复杂事务测试,64个线程 * SAN O_DIRECT:读/写请求:31560140(每秒8766.61个) * SAN O_DSYNC:读/写请求:5179457(每秒1438.52) * SAN fdatasync:读/写请求:9445774(每秒2623.66) *本地磁盘O_DIRECT:读/写请求:3258595(每秒905.06) *本地磁盘O_DSYNC:读/写请求:3494632(每秒970.65) *本地磁盘fdatasync:读/写请求:4223757(每秒1173.04。 但是,O_DIRECT禁用OS级别的缓存,可以禁用双重缓存,这会显示出更好的I / O吞吐量。 O_DIRECT而不是一起去O_DSYNC好吗?这两个选项有些令人困惑。哪个选项可以显示出更好的I / O吞吐量并增强性能,而不会对数据,读/写(特别是在生产中)产生任何影响?根据您的个人经验有更好的建议吗? 我可以在帖子中看到Rolando Update : 这两个参数仍然有些混乱。在可以看到大多数使用的生产配置模板的地方O_DIRECT,没有任何推荐的地方O_DSYNC。 系统 MySQL 5.1.51-enterprise-gpl-pro-log 红帽企业Linux服务器5.5版 具有Raid Controller的DELL DRAC,具有电池写回缓存512MB Dell PERC控制器H700带有备用电池(BBU)。 附加信息 mysql>显示类似'innodb_thread_concurrency'的变量; …

1
为什么DELETE比SELECT慢得多,然后按ID进行DELETE?
我有一个非常繁忙的InnoDB表(200,000行,我猜每秒大概有几十个查询)。由于一个错误,我得到了14行,其中包含(相同)无效的电子邮件地址,并希望将其删除。 我只是尝试DELETE FROM table WHERE email='invalid address'了一下,并在大约50秒后得到了“超出了锁定等待超时”。这并不奇怪,因为未对行列进行索引。 但是,然后我做了SELECT id FROM table WHERE email='invalid address',那花了1.25秒。运行DELETE FROM table WHERE id in (...),从SELECT结果中复制粘贴ID,花费了0.02秒。 到底是怎么回事?有人可以解释为什么带有条件的DELETE这么慢以至于超时,但是执行SELECT然后按ID删除却是如此之快吗? 谢谢。 编辑:根据要求,我发布了表结构以及一些explain结果。我还应注意,没有任何外键引用此表。 但是,这种情况对我来说似乎很简单:我有一个未索引的字段可供选择。这需要扫描整个表,但是它并不大。id是主键,因此按ID删除应该是非常快速的。 mysql> show create table ThreadNotification2 \G *************************** 1. row *************************** Table: ThreadNotification2 Create Table: CREATE TABLE `ThreadNotification2` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `alertId` bigint(20) DEFAULT …

2
如果按顺序执行,这两个查询会导致死锁吗?
几乎可以肯定这是我提出另一个问题的原因,但是我认为有必要将两者分开,因为我有一个假设,该假设基于以下日志,我希望对其进行伪造或验证。 我的假设是,另一个死锁实际上是以下查询的结果,根据我的理解,隐藏原始查询的原因是innodb状态仅显示最近的事务(这对吗?)。 根据日志,我检查了我们的代码,发现依次执行了以下两个查询: db.Execute("UPDATE people SET iphone_device_id=NULL WHERE iphone_device_id=@0 AND people_id<>@1", DeviceID, m_User.people_id); // I have hard coded this query in this snippet to simplify things db.Execute("UPDATE people SET company_id = 444, name = 'Dad', password = '<pass>', temp_password = NULL, reset_password_hash = NULL, email = '<redacted>@gmail.com', phone = NULL, …

2
在提交之前,InnoDB在哪里存储交易数据?
我做了使用一些测试READ_COMMITTED,并READ_UNCOMMITTED在家里,使用JDBC技术。 我看到它READ_UNCOMMITTED实际上可以读取未提交的数据,例如,来自尚未提交的某些事务的数据(可以执行UPDATE查询)。 问题 未提交的数据存储在哪里,以便一个READ_UNCOMMITTED事务可以从另一个事务中读取未提交的数据? 为什么READ_COMMITTED事务不可能读取未提交的数据,即执行“脏读”?哪种机制强制执行此限制?

2
一对一关系是否正常化?
考虑我们有大量的统计数据记录;例如20-30 INT列。最好将整个集合都保留在一个表中,因为它们都属于一条记录,还是创建另一个具有一对一关系的表。 前者的优点是避免JOIN并可以快速访问相应记录的所有统计数据。 后者的优点是使色谱柱保持整洁。第一列是读密集型的,第二列是写密集型的。当然,我认为它对性能没有显着影响,因为我将InnoDB与行级阻塞一起使用。 总的来说,我想知道为一条记录分离不同的数据集是否有用?

5
MySQL-用于InnoDB的ALTER TABLE的最快方法
我有一个要更改的InnoDB表。该表有约8000万行,并退出了一些索引。 我想更改其中一列的名称并添加更多索引。 最快的方法是什么(假设即使停机,我也可能会遭受痛苦-服务器是未使用的从属服务器)? 是“普通” alter table的最快解决方案吗? 此时,我只关心速度:)

1
查看最后几个innodb僵局
我看到可以在mysql / innodb中查看最新的死锁,但是有没有办法查看过去的死锁?我们有两个僵局问题,一个很重要,另一个不重要。不太重要的死锁每天发生几次,因此它成为“最新的”死锁。

2
INSERT INTO新创建的目标表后,ROLLBACK不起作用
我正在研究将CSV文件(customers.csv)导入MySQL表(customers)的PHP脚本。 在将CSV文件的内容插入mysql表之前,我首先备份原始customers表。 我将整个导入过程(包括备份)包装在mysql事务中(以解决CSV在中间某处损坏的情况,并确保导入是原子的)。 问题是,当我在INSERT INTO语句后立即调用它时,ROLLBACK似乎不起作用:通过phpMyAdmin检查数据库时,我可以看到新创建的表,并且roollback之后仍存在ROWS INSIDE IT。 这是操作日志: [2015-01-19 14:08:11] DEBUG: "START TRANSACTION" [] [] [2015-01-19 14:08:11] DEBUG: SHOW TABLES LIKE :table_name; [] [] [2015-01-19 14:08:28] DEBUG: CREATE TABLE `customers__20150119_14_08_20` LIKE `customers` [] [] [2015-01-19 14:08:37] DEBUG: INSERT INTO `customers__20150119_14_08_20` SELECT * FROM `customers` [] [] [2015-01-19 14:08:50] DEBUG: "ROLLBACK" …

2
查找每个连续系列行的总持续时间
MySQL版本 该代码将在MySQL 5.5中运行 背景 我有一张像下面的桌子 CREATE TABLE t ( id INT NOT NULL AUTO_INCREMENT , patient_id INT NOT NULL , bed_id INT NOT NULL , ward_id INT NOT NULL , admitted DATETIME NOT NULL , discharged DATETIME , PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; 该表与医院中的患者有关,并且存储每个患者住院时花时间的床铺。 每个病房可能有多个病床,每个病人可能会移到同一病房内的另一个病床。 目的 我想做的是找出每个患者花了多少时间在一个特定的病房而又没有转移到另一个病房。即,我想找到他在同一病房中度过的连续时间的总持续时间。 …

1
为什么自动增量跳跃的次数超过插入的行数?
auto_increment使用存储过程执行批量插入后,我在Bids表的bidID中记录的值中看到这种奇怪的行为,对此感到非常不安: INSERT INTO Bids (itemID, buyerID, bidPrice) SELECT itemID, rand_id(sellerID, user_last_id), FLOOR((1 + RAND())*askPrice) FROM Items WHERE closing BETWEEN NOW() AND NOW() + INTERVAL 1 WEEK ORDER BY RAND() LIMIT total_rows; 例如,如果开始时的auto_incrementbidID值为101,并且我插入了100行,则结束值将变为213,而不是201。但是,这些插入的行的bidID依次运行,最大为201。 检查以下内容后, SHOW VARIABLES LIKE 'auto_inc%'; +--------------------------+-------+ | Variable_name | Value | +--------------------------+-------+ | auto_increment_increment | 1 | | …

2
动态更改为innodb_flush_log_at_trx_commit
这与这个问题有关。它确实有助于为InnoDB表获得更好的性能。 根据MySQL手册,innodb_flush_log_at_trx_commit是全局动态变量。因此,我可以使用SET GLOBAL命令更改它,但它似乎正在工作。 mysql> SET GLOBAL innodb_flush_log_at_trx_commit=2; Query OK, 0 rows affected mysql> SHOW VARIABLES LIKE 'innodb_flush_log_at_trx_commit'; +--------------------------------+-------+ | Variable_name | Value | +--------------------------------+-------+ | innodb_flush_log_at_trx_commit | 2 | +--------------------------------+-------+ 1 row in set 但是,它并没有改变实际的MySQL设置。当我更新my.cnf并重新启动MySQL服务器时,它确实起作用了。因此,我不能在运行时更改全局变量吗? 我更喜欢默认值innodb_flush_log_at_trx_commit=1,但是我需要将其更改为2,然后才能运行恢复过程以使大型数据库更快地运行。但是,当过程完成后,我想将值更改回1。是否可以在运行时执行此操作? 我没有访问共享托管服务器上的my.cnf的权限。

4
MySQL InnoDB甚至在READ COMMITTED中也将主键锁定在删除状态
前言 我们的应用程序运行多个线程,这些线程DELETE并行执行查询。这些查询会影响隔离的数据,即,不可能存在并发DELETE发生在来自不同线程的同一行上。但是,对于每个文档,MySQL DELETE均对语句使用所谓的“下一个键”锁定,该锁定既锁定匹配键又锁定一些间隙。这会导致死锁,我们发现的唯一解决方案是使用READ COMMITTED隔离级别。 问题 执行DELETE具有JOINs个大表的复杂语句时会出现问题。在特定情况下,我们有一个带有警告的表,该表只有两行,但是查询需要从两个单独的INNER JOINed表中删除属于某些特定实体的所有警告。查询如下: DELETE pw FROM proc_warnings pw INNER JOIN day_position dp ON dp.transaction_id = pw.transaction_id INNER JOIN ivehicle_days vd ON vd.id = dp.ivehicle_day_id WHERE vd.ivehicle_id=? AND dp.dirty_data=1 当day_position表足够大时(在我的测试案例中有1448行),那么即使使用READ COMMITTED隔离模式的任何事务也会阻塞整个 proc_warnings表。 这个问题始终重现这个样本数据- http://yadi.sk/d/QDuwBtpW1BxB9都在MySQL 5.1(在59年1月5日检查)和MySQL 5.5(在MySQL 5.5.24检查)。 编辑:链接的示例数据还包含查询表的架构和索引,为方便起见,在此处复制: CREATE TABLE `proc_warnings` ( `id` int(11) NOT NULL AUTO_INCREMENT, …

3
INNODB性能泄漏在哪里?
我有一个奇怪的问题,似乎无法解决。我不是服务器/数据库管理员,而是Web程序员,所以我希望这里有人可以帮助我。 情况 我正在开发一个处理很多update,insert和delete请求的系统。因此,我选择INNODB作为其行锁定功能的存储引擎。我们使用Gearman并行化在不同服务器上的工作,每10分钟更新60,000条记录。该代码在PHP中,我们正在使用Zend Framework。 问题 SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction 我们几乎每30分钟就会从我们的一名Gearman工人那里收到上述错误。 的 mysql_report MySQL 5.1.63-0+squeeze1 uptime 15 9:52:12 Tue Sep 11 21:25:23 2012 __ Key _________________________________________________________________ Buffer used 55.00k of 16.00M %Used: 0.34 Current 2.92M %Usage: 18.24 Write hit 99.95% Read hit 100.00% __ …

1
InnoDB INSERT性能的功能
嗨,我正在运行Percona Server的最新版本。 服务器版本:5.5.24-55 Percona服务器(GPL),版本26.0 我有这些特征的10 cpu盒。 processor : 0 vendor_id : AuthenticAMD cpu family : 16 model : 9 model name : AMD Opteron(tm) Processor 6128 stepping : 1 microcode : 0x10000d9 cpu MHz : 800.000 cache size : 512 KB 它具有SSD和64GB RAM。Innodb大约为10GB,因此innodb_buffer_pool_size设置为10GB。 我有一张桌子,如下所示: create table TODAY ( symbol_id integer …

6
重启服务器后,防止在Innodb数据库中重置auto_increment id
我最近读到,由于服务器重启时InnoDB如何重新计算AUTO_INCREMENT值,所以ID列表高端上的任何记录都可能重用了它们的ID。 通常,这不是问题,因为删除用户后,与ID关联的所有内容也会从其他表中删除。 但是,我故意将他们的论坛帖子保留为孤立状态,标记为“由= User#123 =“发表”,以便保留过去的对话。显然,如果ID被重用,这将是一个问题。 我以前从未遇到过此问题,因为总是有足够的新用户,因此不太可能以这种方式重复使用ID。但是,在我的新项目中,注册很少,并且频繁删除不活动的用户(尤其是因为“ Open Alpha”帐户仅持续三天作为预览),这种ID重用现在已经发生了三分之三。 我通过在其他位置保存AUTO_INCREMENT的正确值并使用它而不是依赖内部值来“解决”该问题。有实际的方法让InnoDB记住实际的上一个值吗?
11 mysql  innodb 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.