mysql insert的几点性能分析(DELAYED 、IGNORE)

[ 2010-12-10 09:08:35 | 作者: admin ]
字号: | |
 INSERT语法 INSERT [LOW_PRIORITY |DELAYED| HIGH_PRIORITY] [IGNORE] [INTO]tbl_name[(col_name,...)] VALUES ({expr| DEFAULT},…),(…),…

  [ON DUPLICATE KEY updatecol_name=expr, ... ]

  或:

  INSERT [LOW_PRIORITY |DELAYED| HIGH_PRIORITY] [IGNORE]

  [INTO]tbl_name

  SETcol_name={expr| DEFAULT}, …

  [ON DUPLICATE KEY updatecol_name=expr, ... ]

  或:

  INSERT [LOW_PRIORITY | HIGH_PRIORITY] [IGNORE]

  [INTO]tbl_name[(col_name,...)]

  SELECT …

  [ON DUPLICATE KEY updatecol_name=expr, ... ]

  1、DELAYED的使用

  使用延迟插入操作

  DELAYED调节符应用于INSERT和REPLACE语句。当DELAYED插入操作到达的时辰,

  服务器把数据行放入1个队列中,并当即给客户端归回1个状态信息,这样客户

  端就可以在数据表被真正地插入记载之前继续进行操作了。要是读取者从该数据

  表中读取数据,队列中的数据就会被保持着,直到没有读取者为止。接着服务器

  开始插入延迟数据行(delayed-row)队列中的数据行。在插入操作的同时,服务器

  还要检查是否有新的读取请求到达和等候。要是有,延迟数据行队列就被挂起,

  容许读取者继续操作。当没有读取者的时辰,服务器再次开始插入延迟的数据行。

  这个过程一直进行,直到队列空了为止。

  几点要注重事项:

  · INSERT DELAYED应该仅用于指定值清单的INSERT语句。服务器忽略用于INSERT DELAYED…SELECT语句的DELAYED。

  · 服务器忽略用于INSERT DELAYED…ON DUPLICATE UPDATE语句的DELAYED。

  · 因为在行被插入前,语句立刻归回,以是您不能使用LAST_INSERT_ID()来获取不佣人力_INCREMENT值。不佣人力_INCREMENT值可能由语句生成。

  · 对SELECT语句,DELAYED行不偏见,直到这些行确实被插入了为止。

  · DELAYED在附属复制服务器中被忽略了,因为DELAYED不会在附属服务器中产生与主服务器纷歧样的数据。

  注重,目前在队列中的各行只保存在存储器中,直到它们被插入到表中为止。这意味着,要是您强行中止了mysqld(例如,使用kill -9)

  或要是mysqld不测停止,则所有无被写入磁盘的行都会丢掉。

  2、IGNORE的使用

  IGNORE是MySQL相对标准SQL的扩展。要是在新表中有重复要害字,

  或当STRICT模式开始工作后出现警告,则使用IGNORE控制ALTER TABLE的运行。

  要是没有指定IGNORE,当重复要害字错误发生时,复制操作被抛却,归回前一步骤。

  要是指定了IGNORE,则对有重复要害字的行,只使用第一行,其他有冲突的行被删除。

  并且,对错误值进行修正,使之尽量接近不错值。

  insert ignore into tb(…) value(…)

  这样不消校验是否存在了,有则忽略,无则新增

  三、ON DUPLICATE KEY UPDATE的使用

  要是您指定了ON DUPLICATE KEY UPDATE,并且插入行后会引起在1个UNIQUE索引或PRIMARY KEY中出现重复值,则执行旧行UPDATE。例如,要是列a被定义为UNIQUE,并且包含值1,则以下两个语句具备相同的效果:

  mysql>INSERT INTO table (a,b,c) VALUES (1,2,3)

  ->ON DUPLICATE KEY UPDATE c=c+1;

  mysql>UPDATE table SET c=c+1 WHERE a=1;

  要是行作为新记载被插入,则受影响行的值为1;要是原有的记载被更新,则受影响行的值为2。

  注释:要是列b也是唯一列,则INSERT与此UPDATE语句相当:

  mysql>UPDATE table SET c=c+1 WHERE a=1 OR b=2 LIMIT 1;

  要是a=1 OR b=2与多个行向匹配,则只有1个行被更新。通常,您应该尽量避免对带有多个唯一要害字的表使用ON DUPLICATE KEY子句。

  您可以在UPDATE子句中使用VALUES(col_name)函数从INSERT…UPDATE语句的INSERT部分引用列值。换句话说,要是没有发生重复要害字冲突,则UPDATE子句中的VALUES(col_name)可以引用被插入的col_name的值。本函数特别合用于多行插入。VALUES()函数只在INSERT…UPDATE语句中有意义,其他时辰会归回灭茬。

  示例:

  mysql>INSERT INTO table (a,b,c) VALUES (1,2,3),(4,5,6)

  ->ON DUPLICATE KEY UPDATE c=VALUES(a)+VALUES(b);

  本语句与以下两个语句作用相同:

  mysql>INSERT INTO table (a,b,c) VALUES (1,2,3)

  ->ON DUPLICATE KEY UPDATE c=3;

  mysql>INSERT INTO table (a,b,c) VALUES (4,5,6)

  ->ON DUPLICATE KEY UPDATE c=9;

  当您使用ON DUPLICATE KEY UPDATE时,DELAYED选项被忽略。

  总结:DELAYED 做为快速插入,其实不是很关心掉效性,提高插入性能。

  ignore 只关注主键对应记载是不存在,无则新增,有则忽略。

  ON DUPLICATE KEY UPDATE 在新增时操作,关注非主键列,注重与ignore的区别。有则更新指定列,无则新增。

  来自:http://hi.baidu.com/hongshicong88/blog/item/0a56ab247d339b6b34a80fdc.html
[最后修改由 admin, 于 2010-12-10 09:19:01]
评论Feed 评论Feed: http://blog.xg98.com/feed.asp?q=comment&id=1583

这篇日志没有评论。

此日志不可发表评论。