下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

MySQL优化之insert/delete/update

作者:课课家教育     来源: http://www.kokojia.com点击数:913发布时间: 2017-08-21 10:00:50

标签: 数据库MySQL语句优化

  用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句。言外之意,就是对数据进行修改。在标准的SQL中有3个语句,它们是INSERT、UPDATE以及DELETE。

MySQL优化之insert/delete/update_数据库_MySQL_语句优化_课课家教育

  INSERT、UPDATE以及DELETE的优化

  加快插入操作的方法:

  1、同时从同一个客户端插入很多行,使用含有多个VALUE的INSERT语句同时插入多行,比使用单行INSERT语句一次插一行快。如果向一个非空表添加数据,可以调节bulk_insert_buffer_size变量,使数据插入更快。

  2、从不同的客户端插入很多行,通过INSERTDELAYED语句加快速度。

  3、用MyISAM,如果在表中没有删除的行,能在SELECT语句正在运行的同时插入行。

  4、当从一个文本文件装载一个表时,适用LOADDATAINFILE,比使用很多INSERT语句快20倍。

  5、锁定表可以加速用多个语句执行的INSERT操作:LOCKTABLESaWRITE;INSERTINTOaVALUES…;INSERTINTOaVALUES…;…UNLOCKTABLES;

  这样性能会提升,因为索引缓存区仅在所有INSERT语句完成后刷新到磁盘上一次。否则,有多少INSERT语句就要有多少索引缓存区的刷新。如果能用一个语句插入所有的行,就不要锁定。

  加快更新的方法:

  update更新查询的优化同select查询一样,但需要额外的写开销。写的速度依赖更新的数据大小和更新的索引的数量。所以,锁定表,同时做多个更新比一次做一个快得多。

  加快删除的方法:

  删除一个记录的时间与索引数量成正比。删除一个表的所有行,使用TRUNCATETABLEtbname而不要使用DELETEFROMtbname。

  MySQL还允许改变语句调度的优先级,它可以使来自多个客户端的查询更好地协作,这样单个客户端就不会由于锁定而等待很长时间。改变优先级还可以确保特定类型的查询被处理得更快。

  我们首先应该确定应用的类型,判断应用是以查询为主还是以更新为主的,是确保查询效率还是确保更新的效率,决定是查询优先还是更新优先。

  下面我们提到的改变调度策略的方法主要是针对Myisam存储引擎的,对于Innodb存储引擎,语句的执行是由获得行锁的顺序决定的。

  MySQL的默认的调度策略可用总结如下:

  写入操作优先于读取操作。

  对某张数据表的写入操作某一时刻只能发生一次,写入请求按照它们到达的次序来处理。

  对某张数据表的多个读取操作可以同时地进行。

  MySQL提供了几个语句调节符,允许你修改它的调度策略:

  LOW_PRIORITY关键字应用于DELETE、INSERT、LOADDATA、REPLACE和UPDATE。

  HIGH_PRIORITY关键字应用于SELECT和INSERT语句。

  DELAYED关键字应用于INSERT和REPLACE语句。

  如果写入操作是一个LOW_PRIORITY(低优先级)请求,那么系统就不会认为它的优先级高于读取操作。在这种情况下,如果写入者在等待的时候,第二个读取者到达了,那么就允许第二个读取者插到写入者之前。只有在没有其它的读取者的时候,才允许写入者开始操作。这种调度修改可能存在LOW_PRIORITY写入操作永远被阻塞的情况。

  SELECT查询的HIGH_PRIORITY(高优先级)关键字也类似。它允许SELECT插入正在等待的写入操作之前,即使在正常情况下写入操作的优先级更高。另外一种影响是,高优先级的SELECT在正常的SELECT语句之前执行,因为这些语句会被写入操作阻塞。

  如果你希望所有支持LOW_PRIORITY选项的语句都默认地按照低优先级来处理,那么请使用--low-priority-updates选项来启动服务器。通过使用INSERTHIGH_PRIORITY来把INSERT语句提高到正常的写入优先级,可以消除该选项对单个INSERT语句的影响。

  小编结语:

  更多内容尽在课课家教育!

赞(24)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程