• 每天进步一点点!

文章分类

推荐网站

常用手册

执行一次SQL查询,UPDATE多行记录【转载】

通常情况下,我们会使用以下SQL语句来更新字段值:

UPDATE mytable SET myfield='value' WHERE other_field='other_value';

     但是,如果你想更新多行数据,并且每行记录的各字段值都是各不一样,你会怎么办呢?举个例子,我的博客有三个分类目录(免费资源、教程指南、橱窗展示),这些分类目录的信息存储在数据库表categories中,并且设置了显示顺序字段 display_order,每个分类占一行记录。如果我想重新编排这些分类目录的顺序,例如改成(教程指南、橱窗展示、免费资源),这时就需要更新categories表相应行的display_order字段,这就涉及到更新多行记录的问题了,刚开始你可能会想到使用循环执行多条UPDATE语句的方式,就像以下的php程序示例:

foreach ($display_order as $id => $ordinal) {
    $sql="UPDATE categories SET display_order = $ordinal WHERE id = $id";
    mysql_query($sql);
}

     这种方法并没有什么任何错误,并且代码简单易懂,但是在循环语句中执行了不止一次SQL查询,在做系统优化的时候,我们总是想尽可能的减少数据库查询的次数,以减少资源占用,同时可以提高系统速度。幸运的是,还有更好的解决方案,只不过SQL语句稍微复杂点,但是只需执行一次查询即可,语法如下:

类别:MySQL | 浏览(69) | 评论(0) | 阅读全文>>

SQL语句优化技巧【转载】

  1. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
  2. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null

可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:

select id from t where num=0
  1. 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
  2. 应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20

 可以这样查询:

select id from t where num=10

union all

select id from t where num=20
  1. in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)

对于连续的数值,能用 between 就不要用 in 了:

select id from t where num between 1 and 3
  1. 下面的查询也将导致全表扫描:
select id from t where name like '%abc%'

若要提高效率,可以考虑全文检索。

类别:MySQL | 浏览(99) | 评论(0) | 阅读全文>>

MySql的Bin-Log日志【原创】

  • 简介

Bin-Log日志以一种更有效的格式,并且是事务安全的方式包含更新日志中可用的所有信息。

 

Bin-Log日志包含了所有更新了数据或者已经潜在更新了数据(例如,没有匹配任何行的一个DELETE)的所有语句。语句以“事件”的形式保存,它描述数据更改。

 

注释:Bin-Log日志已经代替了老的更新日志,更新日志在MySQL 5.1中不再使用。

 

Bin-Log日志还包含关于每个更新数据库的语句的执行时间信息。它不包含没有修改任何数据的语句。如果你想要记录所有语句(例如,为了识别有问题的查询),你应使用一般查询日志。

 

Bin-Log日志的主要目的是在恢复使能够最大可能地更新数据库,因为Bin-Log日志包含备份后进行的所有更新。

 

Bin-Log日志还用于在主复制服务器上记录所有将发送给从服务器的语句

 

  • 开启mysqlBin-Log日志

在mysql的配置文件(my.cnf)中,添加下面一行。

log-bin = mysql-bin

我这里没有指定存放路径,默认会存放在mysql的数据存放目录,所有的二进制文件都以mysql-bin开头,当然你也可以自己指定mysql bin-log的存放路径和名称。

保存mysql的配置文件,重启mysql

类别:MySQL | 浏览(9054) | 评论(0) | 阅读全文>>

MySql的Grant命令【原创】

MySQL 赋予用户权限命令的简单格式可概括为:

grant 权限 on 数据库对象 to 用户

 

  • grant  普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。
grant select, insert, update, delete on testdb.* to user@'%'

 

  • grant 创建、修改、删除 MySQL 数据表结构权限。
grant create,alter,drop on testdb.* to user@'192.168.0.%';

 

  • grant 操作 MySQL 外键权限。
grant references on testdb.* to user@'192.168.0.%';

 

  • grant 操作 MySQL 临时表权限。
grant create temporary tables on testdb.* to user@'192.168.0.%';

 

  • grant 操作 MySQL 索引权限。
grant index on testdb.* to user@'192.168.0.%';

 

  • grant 操作 MySQL 视图、查看视图源代码 权限。
grant create routine on testdb.* to user@'192.168.0.%'; 
grant alter  routine on testdb.* to user@'192.168.0.%'; 
grant execute        on testdb.* to user@'192.168.0.%';

 

  • grant 管理某个 MySQL 数据库的权限
grant all privileges on testdb to user@'localhost'

 

类别:MySQL | 浏览(113) | 评论(0) | 阅读全文>>

mysql中批量替换某个字段中的字符串【原创】

今天我的一个域名到期了,可是图片的url地址在mysql中存储的还是之前用的那个域名,造成等图片正常显示,想到用mysql的批量替换,将原来的域名替换成现在的域名。用到了下面的mysql命令

UPDATE 表名 SET 字段 = REPLACE(字段,'待替换内容','替换值');

 

上张图片

 UPDATE notes SET note_content=REPLACE(note_content, '51makeit', 'keepdoit' );

 

再看下面的一个例子:

想讲title中的“第*讲:”去掉,可以用到这个命令

SELECT id,kid,title FROM `ke_classroom` WHERE kid=148;
#update ke_classroom set title = replace(title, title,substring(title, locate(':', title)+1)) WHERE kid=148; 

 

类别:MySQL | 浏览(100) | 评论(0) | 阅读全文>>