mysql用法总结及整理php
SELECT user_id, count(*) as total FROM `blog_index_tbl` WHERE add_time BETWEEN UNIX_TIMESTAMP('2016-01-01 00:00:00') AND UNIX_TIMESTAMP('2016-12-31 23:59:59') GROUP BY user_id HAVING total > 1 ORDER BY total DESC;
最近研发的项目对DB依赖比较重,梳理了这段时间使用MySQL遇到的8个比较具备表明性的问题,答案也比较偏本身的开发实践,没有DBA专业和深刻,有出入的请使劲拍砖!...html
MySQL读写性能是多少,有哪些性能相关的配置参数?mysql
MySQL负载高时,如何找到是由哪些SQL引发的?sql
如何针对具体的SQL作优化?数据库
SQL层面已难以优化,请求量继续增大时的应对策略?性能
MySQL如何作主从数据同步?优化
如何防止DB误操做和作好容灾?this
该选择MySQL哪一种存储引擎,Innodb具备什么特性?spa
MySQL内部结构有哪些层次?.net
复制表结构+复制表数据
mysql> create table t3 like t1; mysql> INSERT INTO t3 SELECT * t1;
注意:若是须要把表中的某一个字段拷贝到另外一个表中对应的字段处,就可使用相应的字段。
MyIsam
引擎不支持事务处理,必须使用 innoDB
而后进行 commit
命令提交,数据才能被真正删除,不然该操做会锁行,其余的不能进行操做。
SET autocommit=0;
DELETE FROM test_tbl WHERE id=1;
在开启事务的状况下,另外一个用户在表界面手动删除id=1的用户,会出现锁行的状况出现
commit
综上,若是有事务,则其余操做会被锁行,等到事务提交后,才能对锁行的进行
编辑、删除
操做。
关于事务的一篇文章,你们能够看看:
MySQL默认操做模式就是 autocommit
自动提交模式。这就表示除非显式地开始一个事务,不然每一个查询都被当作一个单独的事务自动执行。咱们能够经过设置autocommit的值改变是不是自动提交autocommit模式。
经过如下命令能够查看当前autocommit模式
mysql> show variables like 'autocommit'; | |
---|---|
Variable_name | Value |
autocommit | ON |
1 row in set (0.04 sec)
从查询结果中,咱们发现Value的值是ON,表示autocommit开启。咱们能够经过如下SQL语句改变这个模式
mysql> set autocommit = 0;
值0和OFF都是同样的,固然,1也就表示ON。经过以上设置autocommit=0,则用户将一直处于某个事务中,直到执行一条commit提交或rollback语句才会结束当前事务从新开始一个新的事务。
举个例子:
张三给李四转帐500元。那么在数据库中应该是如下操做:
1,先查询张三的帐户余额是否足够
2,张三的帐户上减去500元
3,李四的帐户上加上500元
以上三个步骤就能够放在一个事务中执行提交,要么所有执行要么所有不执行,若是一切都OK就commit提交永久性更改数据;若是出错则rollback回滚到更改前的状态。
利用事务处理就不会出现张三的钱少了李四的帐户却没有增长500元或者张三的钱没有减去李四的帐户却加了500元。
MySQL默认的存储引擎是MyISAM,MyISAM存储引擎不支持事务处理,因此改变autocommit没有什么做用。但不会报错,因此要使用事务处理的童鞋必定要肯定你所操做的表示支持事务处理的,如InnoDB。若是不知道表的存储引擎能够经过查看建表语句查看建表的时候有没有指定事务类型的存储引擎,若是没有指定存储引擎默认则是MyISAM不支持事务的存储引擎。
固然,事务处理是为了保障表数据原子性、一致性、隔离性、持久性。这些都是要消耗系统资源的,要谨慎选择。
php中使用事物实例
$state = 0; // 添加事物处理 try { // 开启事物 $GLOBALS['db']->beginTransaction(); // 更新管理平台密码 $state = $GLOBALS['db']->query("update admin_user set password='$password_confirm' where user_id=$user_id"); if($state != true) { throw new Exception ('更新管理平台密码失败!'); } $ret = $this->modify_ldap_pwd($user_name, $user_password_old, $user_password_confirm); if(!$ret) { throw new Exception ('更新LDAP密码失败!'); } // 提交事物 $GLOBALS['db']->commit(); $state = 1; } catch (Exception $e) { // 回滚 $GLOBALS['db']->rollBack(); }
一个表的外键一定是另一个表的主键,只有innodB
支持外键和事务处理。
在数据库应用,咱们常常要用到惟一编号,以标识记录。在MySQL中可经过数据列的AUTO_INCREMENT属性来自动生成。mysql支持多种数据表,每种数据表的自增属性都有差别,这里将介绍各类数据表里的数据列自增属性。
数据库中设置了自增列,有时候须要清楚数据库重新录入数据.最多见的作法就是使用sql语句"delete 代表名"或是直接选中数据,而后删除数据.可是再次插入数据的时候,你就会发现自增列会从上次删除数据的最大值的下一个值开始,而不是从1开始的.有没有一种感受,感受挺苦恼的.
如今就交你一种方法,让你删除数据后,再次插入记录的时候,自增列从1开始.
truncate table 你的表名
// 这样不但将数据所有删除,并且从新定位自增的字段
truncate table `goods_tbl`;
今天在设计数据表时,忽然发现原来FLOAT
是很不靠谱的,因此在这里建议你们换成DOUBLE
类型,
缘由是:
在mysql手册中讲到,在MySQL中的全部计算都是使用双精度完成的,使用float(单精度)会有偏差,出现意想不到的结果。
在咱们查询数据时,MySQL使用64位十进制数值的精度执行DECIMAL操做,float(5.54) = 5.54 若是出现精度丢失,这个是不等的。这样,原本咱们应该能查到的数据就会莫名其妙的消失。