标签: innodb

加快从MyISAM到InnoDB的转换

我有一个MySQL 1.5 GB MyISAM表(1.0 GB数据,0.5 GB索引)正在制作中,我即将转换为InnoDB.

由于该表用于生产,我希望尽可能缩短停机时间.

我的问题:

  • 应该调整哪些MySQL配置选项以加快速度ALTER TABLE table_name ENGINE=InnoDB;

  • 为了加快生产数据库表从MyISAM到InnoDB的转换,可以使用哪些其他技巧?

mysql optimization myisam innodb

17
推荐指数
1
解决办法
6821
查看次数

如何在应用程序级别处理MySQL死锁情况?

当MySQL/InnoDB发生死锁情况时,它会返回这个熟悉的错误:

'试图锁定时发现死锁; 尝试重启事务'

所以我所做的就是记录进入事务的所有查询,以便在事务中的语句失败时可以简单地重新发出它们.简单.

问题:当您的查询取决于先前查询的结果时,这不能很好地工作.

例如:

START TRANSACTION;
INSERT INTO some_table ...;
-- Application here gets ID of thing inserted: $id = $database->LastInsertedID()
INSERT INTO some_other_table (id,data) VALUES ($id,'foo');
COMMIT;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我不能简单地重新发布最初创建的事务.在事务失败后,第一个SQL语句获取的ID不再有效,但由第二个语句使用.同时,许多对象已经填充了来自事务的数据,然后在事务回滚时变得过时.当然,应用程序代码本身不会与数据库"回滚".

问题是:我如何在应用程序代码中处理这些情况?(PHP)

我假设有两件事.如果您认为我走在正确的轨道上,请告诉我:

1)由于数据库不能在所有情况下逐字重新发布事务,因此我的原始解决方案不起作用且不应使用.

2)执行此操作的唯一好方法是将任何和所有事务发布代码包装在它自己的try/catch块中,并尝试重新发出代码本身,而不仅仅是SQL.

感谢您的输入.你摇滚.

php mysql database deadlock innodb

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

如何锁定尚不存在的InnoDB行?

我如何保证我可以搜索我的数据库中是否存在用户名,然后将该用户名作为新行插入数据库而不在SELECTINSERT语句之间进行任何拦截?

几乎就像我锁定了一个不存在的行.我想用用户名"Foo"锁定不存在的行,这样我现在可以检查它是否存在于数据库中并将其插入到数据库中(如果它尚不存在而没有任何中断).

我知道使用LOCK IN SHARE MODEFOR UPDATE存在,但据我所知,这只适用于已经存在的行.我不知道在这种情况下该怎么做.

mysql innodb locking rowlocking database-locking

17
推荐指数
3
解决办法
5262
查看次数

LIMIT 1非常慢,对于特定记录,使用不同的键

我正在诊断一个间歇性的慢查询,并在MySQL中发现了一个奇怪的行为我无法解释.它只针对一个特定情况选择不同的非最佳关键策略,只有在做一个时LIMIT 1.

表(为简洁起见,删除了一些未引用的数据列)

CREATE TABLE `ch_log` (
    `cl_id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `cl_unit_id` INT(11) NOT NULL DEFAULT '0',
    `cl_date` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
    `cl_type` CHAR(1) NOT NULL DEFAULT '',
    `cl_data` TEXT NOT NULL,
    `cl_event` VARCHAR(255) NULL DEFAULT NULL,
    `cl_timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `cl_record_status` CHAR(1) NOT NULL DEFAULT 'a',
    PRIMARY KEY (`cl_id`),
    INDEX `cl_type` (`cl_type`),
    INDEX `cl_date` (`cl_date`),
    INDEX `cl_event` (`cl_event`),
    INDEX `cl_unit_id` (`cl_unit_id`),
    INDEX `log_type_unit_id` (`cl_unit_id`, `cl_type`),
    INDEX `unique_user` (`cl_user_number`, `cl_unit_id`) …
Run Code Online (Sandbox Code Playgroud)

mysql sql optimization performance innodb

17
推荐指数
1
解决办法
611
查看次数

使用Laravel队列时如何避免作业数据库表锁问题?

我正在使用Laravel 5.1.

队列用于在多个系统之间进行数据获取/同步.

我使用数据库驱动程序,3"artisan queue:work --daemon"进程一直在运行.

作业由系统用户和调度程序(cron)分派.三个队列用于确定作业的优先级.

一切似乎工作得很好 - 作业表充满了记录,系统负责处理它们并删除已完成的记录.

但是一段时间后锁定问题开始干扰:

SQLSTATE [40001]:序列化失败:1213尝试获取锁定时发现死锁; 尝试重新启动事务

'RuntimeException',消息'在事务中无法交换PDO实例'.

SQLSTATE [HY000]:常规错误:1205超出锁定等待超时; 尝试重新启动事务

我还没有尝试过使用其他队列驱动程序.我真的很想留在数据库中.引擎是InnoDB,jobs表有默认结构和索引.

有没有办法解决这个问题?你的想法是什么?

值得一提的是,DB::reconnect()因为队列工作程序作为守护进程运行,所以我在内部调用我的作业类.

DispatchesJobs正如人们所期望的那样,使用特征调度作业.我不以任何其他方式干扰队列算法.

mysql queue innodb laravel laravel-5

17
推荐指数
1
解决办法
4739
查看次数

无法打开mysql.plugin表.某些插件可能未加载

我有一个MySQL的问题.当我试图启动它时,这给了我一条错误信息,就是这样

2015-12-10 10:52:31 13f4 InnoDB: Warning: Using innodb_additional_mem_pool_size is DEPRECATED. This option may be removed in future releases, together with the option innodb_use_sys_malloc and with the InnoDB's internal memory allocator.
2015-12-10 10:52:31 5108 [Note] InnoDB: Using mutexes to ref count buffer pool pages
2015-12-10 10:52:31 5108 [Note] InnoDB: The InnoDB memory heap is disabled
2015-12-10 10:52:31 5108 [Note] InnoDB: Mutexes and rw_locks use Windows interlocked functions
2015-12-10 10:52:31 5108 [Note] InnoDB: Memory barrier is not used
2015-12-10 10:52:31 5108 [Note] …
Run Code Online (Sandbox Code Playgroud)

mysql innodb

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

MySQL插入性能在大型表上降级

我正在使用一个拥有超过250万行的巨大桌子.架构很简单.

CREATE TABLE MyTable (
        id BIGINT PRIMARY KEY AUTO_INCREMENT,
        oid INT NOT NULL,
        long1 BIGINT NOT NULL,
        str1 VARCHAR(30) DEFAULT NULL,
        str2 VARCHAR(30) DEFAULT NULL,
        str2 VARCHAR(200) DEFAULT NULL,
        str4 VARCHAR(50) DEFAULT NULL,
        int1 INT(6) DEFAULT NULL,
        str5 VARCHAR(300) DEFAULT NULL,
        date1 DATE DEFAULT NULL,
        date2 DATE DEFAULT NULL,
        lastUpdated TIMESTAMP NOT NULL,
        hashcode INT NOT NULL,
        active TINYINT(1) DEFAULT 1,
        KEY oid(oid),
        KEY lastUpdated(lastUpdated),
        UNIQUE KEY (hashcode, active),
        KEY (active)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 MAX_ROWS=1000000000;
Run Code Online (Sandbox Code Playgroud)

插件的性能显着下降.表中有多达1.5亿行,过去需要5-6秒才能插入10,000行.现在已经上升了2-4倍.Innodb的ibdata文件已增长到107 GB.Innodb配置参数如下.

innodb_buffer_pool_size …
Run Code Online (Sandbox Code Playgroud)

mysql performance innodb

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

如何检查MySQL表是否为UTF-8并具有storageEngine InnoDB?

谷歌搜索只是找到从一种格式更改为另一种格式的说明,但我似乎无法确定如何确定我先拥有哪些格式.

我怎么能够:

  1. 检查表格的字符编码是什么?
  2. 检查表使用的存储引擎是什么?
  3. 检查所有表是否都是特定编码?
  4. 检查所有表是否都有某个存储引擎?

mysql innodb utf-8 storage-engines

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

当MySQL在更新InnoDB表时确切地锁定了一行?

如果我有这个multiupdate查询

UPDATE user u
INNER JOIN user_profile up ON up.user_id = u.id
SET u.name = 'same_name_i_already_had', up.profile.age = 25
WHERE u.id = 10
Run Code Online (Sandbox Code Playgroud)

假设用户表中的第10行已经具有名称"same_name_i_already_had",因此不应该更新它.

另一方面,user_profile表中的行具有不同的年龄,因此MySQL应该更新它.

假设MySQL作为RDBMS和InnoDB,其行级锁定系统作为两个表的引擎,

MySQL是否会锁定用户表中的行,尽管不必更新该行的名称字段?

mysql innodb locking rowlocking

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

Mysql:表中有7亿条记录

我需要在Mysql表中保存大约78亿条记录.表是读写密集型的.我必须保持每小时插入率至少0.02亿条记录.虽然在桌面上搜索不应超过10秒.我们有一个UI,用户可以根据不同的colums属性进行搜索.

大多数搜索查询可以像:

  1. select * from mytable where prop1='sip:+100008521149' and prop2='asdsa' order by event_timestamp desc limit 10;

  2. select * from mytable where prop1='sip:+100008521149' order by event_timestamp desc limit 10;

  3. select * from mytable where prop2='asdsa' order by event_timestamp desc limit 10;

目前桌上有2个索引:

1- idx_1(prop1,event_timestamp)
2- idx_2(prop2,event_timestamp)
Run Code Online (Sandbox Code Playgroud)

InnoDB设置如下:

    innodb_buffer_pool_size = 70G
    innodb_log_file_size = 4G
    innodb_io_capacity=2000
    innodb_io_capacity_max=6000
    innodb_lru_scan_depth=2000
    innodb_flush_log_at_trx_commit=2
    innodb_log_buffer_size=16M
    innodb_thread_concurrency = 0
    innodb_read_io_threads = 64
    innodb_write_io_threads = 64
    innodb_autoinc_lock_mode = 2
    bulk_insert_buffer_size=33554432
    query_cache_type=1
    query_cache_size=64M
    innodb_flush_neighbors=0
    expire_logs_days=10
    max-connections=500
    long_query_time = 5
    read_buffer_size=16M
    sort_buffer_size=16M …
Run Code Online (Sandbox Code Playgroud)

mysql sql performance innodb elasticsearch

16
推荐指数
2
解决办法
5004
查看次数