1_MySQL基础_DML语句

1.插入数据

1.1 insert 插入数据  REPLACE 与 INSERT 完全一样,可互换。
  insert into student(name,age,address) values('yinzihengjie',17,'boy'); 
  
  INSERT INTO score (change_type,score,user_id) VALUES ('吃饭',10,1);
  优化:

(1)当我们需要批量插入数据的时候,这样的语句却会出现性能问题。例如说,如果有需要插入100000条数据,
     那么就需要有100000条insert语句,每一句都需要提交到关系引擎那里去解析,优化,然后才能够到达存储引擎做真的插入工作。
     上述所说的同时插入多条就是一种优化。(经测试,大概10条同时插入是最高效的)
     
(2)将进程/线程数控制在2倍于CPU数目相对合适
  
(3)采用顺序主键策略(例如自增主键,或者修改业务逻辑,让插入的记录尽可能顺序主键)

(4)考虑使用replace 语句代替insert语句。

   1.2 insert 批量插入
  insert into student(name,age,address) values('yinzihengjie',17,'boy'),("dengziqi",26,'girl');

2 .delete 删除数据
      delete from student where name = 'xxx';
  
  (1)truncate table速度要更快一些,但truncate删除后不记录mysql日志,不可以恢复数据。
  
  (2)如果没有外键关联,innodb执行truncate是先drop table(原始表),再创建一个跟原始表一样空表,速度要远远快于delete逐条删除行记录。
  
  (3)如果使用innodb_file_per_table参数,truncate table 能重新利用释放的硬盘空间,在InnoDB Plugin中,truncate  table为自动回收,如果不是用InnoDB Plugin,那么需要使用optimize table来优化表,释放空间。

       truncate table删除表后,optimize table尤其重要,特别是大数据数据库,表空间可以得到释放 
       
  (4)表有外键关联,truncate table删除表数据为逐行删除,如果外键指定级联删除(delete cascade),
       关联的子表也会会被删除所有表数据。如果外键未指定级联(cascde),truncate table逐行删除数据,如果是父行关联子表行数据,将会报错。

  (5)auto_increment计数器在truncate table后会重置为0.与是否有外键关联没有关系。
注意:
    一个大的 DELETE 或 INSERT 操作,要非常小心,因为这两个操作是会锁表的,表一锁住,其他操作就进不来了。
    因此,我们要交给DBA去拆分,重整数据库策略,比如限制处理1000条。
    MySQL官方手 册得知删除数据的速度和创建的索引数量是成正比的。所以在超大型数据库中,删除时处理好索引关系非常重要。
    推荐的折中方法:在删除数据之前删除这那几个索引,然后删除其中无用 数据,删除完成后重新创建索引。

3. 修改数据

update student set name = 'hujintao' where id = 'xxx';
  
(1). 尽量不要修改主键字段。

(2). 当修改VARCHAR型字段时,尽量使用相同长度内容的值代替。

(3). 尽量最小化对于含有UPDATE触发器的表的UPDATE操作。

(4). 避免UPDATE将要复制到其他数据库的列。

(5). 避免UPDATE建有很多索引的列。

4.REPLACE语句:
    根据应用情况可以使用replace 语句代替insert/update语句。例如:如果一个表在一个字段上建立了唯一索引,
当向这个表中使用已经存在的键值插入一条记录,将会抛出一个主键冲突的错误。如果我们想用新记录的值来覆盖原来的记录值时,
就可以使用REPLACE语句。

    使用REPLACE插入记录时,如果记录不重复(或往表里插新记录),REPLACE功能与INSERT一样,如果存在重复记录,
REPLACE就使用新记录的值来替换原来的记录值。使用REPLACE的最大好处就是可以将DELETE和INSERT合二为一,形成一个原子操作。
这样就可以不必考虑同时使用DELETE和INSERT时添加事务等复杂操作了。

    在使用REPLACE时,表中必须有唯一有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。
    
用法:
(1)同INSERT
    //含义一:与普通INSERT一样功能
      REPLACE INTO score (change_type,score,user_id) VALUES ('吃饭',10,1),('喝茶',10,1),('喝茶',10,1);  
    //含义二:找到第一条记录,用后面的值进行替换
      REPLACE INTO score (id,change_type,score,user_id) VALUES (1,'吃饭',10,1)

 此语句的作用是向表table中插入3条记录。如果主键id为1或2不存在就相当于插入语句:

 INSERT INTO score (change_type,score,user_id) VALUES (‘吃饭’,10,1),(‘喝茶’,10,1),(‘喝茶’,10,1);

 如果存在相同的值则不会插入数据。

(2)replace(object, search, replace),把object中出现search的全部替换为replace。
//用法一:并不是修改数据,而只是单纯做局部替换数据返还而已。
SELECT REPLACE('喝茶','茶','喝')
//结果:  喝喝

 用法二:修改表数据啦,对应下面就是,根据change_type字段找到做任务的数据,用bb来替换
 UPDATE score SET change_type=REPLACE(change_type,'做任务','bb')
 
 在此,做下对比:UPDATE和REPLACE的区别:

1)UPDATE在没有匹配记录时什么都不做,而REPLACE在有重复记录时更新,在没有重复记录时插入。

2)UPDATE可以选择性地更新记录的一部分字段。而REPLACE在发现有重复记录时就将这条记录彻底删除,再插入新的记录。
   也就是说,将所有的字段都更新了。

其实REPLACE更像INSERT与DELETE的结合。

(6). 避免UPDATE在WHERE子句条件中的列。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值