MySQL数据插入优化方法

MySQL数据插入优化方法
一般来说,读写操作是串行的,在MyISAM,但当我们在同一个表的查询和插入操作,以减少锁竞争的频率,根据concurrent_insert设定,MyISAM可以并行处理查询和插入。

并发插入时不允许concurrent_insert = 0。
当concurrent_insert = 1,并发插入,允许一台无孔,和新的数据位于数据文件结束(默认)。
当concurrent_insert = 2,表是否有洞或不是,它是可以被插入在数据文件结束。

在这种方式中,它是集concurrent_insert 2很划算。至于所得到的文件片段,可以使用优化表语法来定期优化。

max_write_lock_count:

默认情况下,写操作的优先级高于读操作的优先级。即使读请求首先发送,发送的请求将被首先处理,然后读取请求将被处理一次。这就产生了一个问题:当我发出请求,我会阻止所有的阅读需求,直到我完成处理所有的请求。在这一点上,你可以考虑使用max_write_lock_count:

max_write_lock_count = 1

有了这个设置,当系统处理写操作时,就暂停了写操作,并给出了执行读操作的机会。

低优先级更新:

我们也可以更清晰,直接降低写操作的优先级,并给予读操作更高的优先级。

低优先级更新= 1

一般来说,concurrent_insert = 2是绝对推荐。作为max_write_lock_count = 1和低优先级更新= 1,这要视情况而定。如果你能降低写操作的优先级,使用低优先级更新= 1,否则使用max_write_lock_count = 1。
设置变量= max_allowed_packet = 1m
设置变量= net_buffer_length = 2k
在MyISAM发动机

1,尝试将数据插入插入形成table_name值(…),(…)。避免使用嵌入table_name值();嵌入table_name值();

2增加bulk_insert_buffer_size(默认8M)

3如果它是一个非空表,使用ALTER TABLE table_name禁用按键,然后加载数据文件,并在执行导入数据:

修改表table_name使钥匙。不如果是一张空桌子需要此操作,因为MyISAM表进口数据首先建立指标时,进口数据为空表。

4,当我们插入数据时,我们需要考虑使用:插入延迟…从而使实际的mysql可以把插入操作放入队列中,并进行相对集中的插入,这是更快的。

5。使用LOAD DATA INFILE比使用INSERT操作速度快了近20倍,并使用此操作尽可能。
在InnoDB引擎

1。在导入数据,执行unique_checks = 0禁止的唯一指标的检测,并运行设置unique_checks = 1。数据导入完成后

2。在导入数据,执行foreign_key_checks = 0禁止外部重点检查,然后执行foreign_key_checks = 1。数据导入完成后

3、设置自动提交= 0禁止自动导入数据自动交易前提交。数据导入完成后,将自动提交= 1恢复自动提交操作。

使用InnoDB引擎表的物理存储是存储在PK的秩序。禁用按键,像MyISAM一样,不能使用

在硬件上改进磁盘I/0非常适合插入速度。因此,如果完成大数据的导入和导出,请尝试比较NB上的硬件,这样可以减少完成时间并防止问题的发生。
当一个线程在一个表上执行一个延迟语句时,如果没有这样的处理程序,就会创建一个处理器线程来处理表的所有延迟语句。
线程检查处理程序是否有延迟锁;如果没有,它告诉处理程序获取它。即使其他线程在表上有读或写锁,它们也可以得到延迟锁。但是,处理程序将等待所有的表锁或刷新表,以确保表结构是最新的。
线程执行INSERT语句,但不会将行写入表中,并将最后一行的副本放入由处理器线程管理的队列中。
客户可以不报告的结果行重复或auto_increment值数;它不能从服务器得到回报,因为插入的插入操作之前完成。如果你使用C API,同样的原因,这mysql_info()函数不返回任何有意义的。
插入到处理器线程更新更新日志中。在多行插入的情况下,更新日志在第一行插入时更新。
在写每一delayed_insert_limit线,处理器检查是否有任何SELECT语句还未完成。如果是的话,在执行之前允许执行这些语句。
当处理器没有在队列更多的行,表锁定。如果新插入延迟命令内没有收到delayed_insert_timeout秒,处理器终止。
如果超过delayed_queue_size行没有特定的处理器队列解决,线程等待队列有空间。这有助于确保mysqld服务器没有延迟的内存队列使用的所有记忆。
处理器的线程将在命令列的MySQL进程表显示delayed_insert。如果执行FLUSH TABLES命令或杀死它杀死thread_id,它会被杀死。但是,在进入表之前,它将首先保存所有排队的行。在此期间,这一次它不会接受来自其他线程的任何新的插入命令。如果执行延迟后插入的命令,将创建一个新的处理器线程。
注意,这意味着如果插入延迟处理器已经运行,则插入延迟命令的优先级比普通插入的优先级要高!其他更新命令要等到插入延迟队列是空的,杀死处理器线程(杀死thread_id)或执行FLUSH TABLES。
以下状态变量提供有关延迟插入命令的信息:delayed_insert_threads处理器线程数
那delayed_writes写延迟插入的行数
not_flushed_delayed_rows等待线数要写

tag:数据方法优化电脑软件mysql

相关内容