引用自:
https://yq.aliyun.com/articles/238364?spm=5176.10695662.1996646101.searchclickresult.4e582ae9RunAqR
MySQL Server 有四种类型的日志——Error Log、General Query Log、Binary Log 和 Slow Query Log。
第一个是错误日志,记录 mysqld 的一些错误。第二个是一般查询日志,记录 mysqld 正在做的事情,比如客户端的连接和断开、来自客户端每条 Sql Statement 记录信息;如果你想准确知道客户端到底传了什么瞎 [哔哔] 玩意儿给服务端,这个日志就非常管用了,不过它非常影响性能。第四个是慢查询日志,记录一些查询比较慢的 SQL 语句——这种日志非常常用,主要是给开发者调优用的。
剩下的第三种就是 Binlog 了,包含了一些事件,这些事件描述了数据库的改动,如建表、数据改动等,也包括一些潜在改动,比如 DELETE FROM ran WHERE bing = luan,然而一条数据都没被删掉的这种情况。除非使用 Row-based logging,否则会包含所有改动数据的 SQL Statement。
那么 Binlog 就有了两个重要的用途——复制和恢复。比如主从表的复制,和备份恢复什么的。
显然,我们执行SELECT等不设计数据变更的语句是不会记录Binlog的,而涉及到数据更新则会记录。要注意的是,对支持事务的引擎如InnoDB而言,必须要提交了事务才会记录Binlog。Binlog是在事务最终commit前写入的,binlog什么时候刷新到磁盘跟参数sync_binlog相关。如果设置为0,则表示MySQL不控制binlog的刷新,由文件系统去控制它缓存的刷新,而如果设置为不为0的值则表示每sync_binlog次事务,MySQL调用文件系统的刷新操作刷新binlog到磁盘中。设为1是最安全的,在系统故障时最多丢失一个事务的更新,但是会对性能有所影响,一般情况下会设置为100或者0,牺牲一定的一致性来获取更好的性能。
WHERE过滤行,而HAVING过滤分组。HAVING支持所有WHERE操作符,HAVING子句中能使用聚集函数。WHERE在数据分组前进行过滤。HAVING在数据分组后进行过滤
where 可以单独用. having 必须跟group by一起用.
除聚集计算语句外,SELECT语句中的每个列都必须在GROUP BY子句中给出
当在查询中没有使用GROUP BY子句时,数据库就把数据表 中的所有行为作为一个组来处理
1 | select sno,count(pno) from sc where grade>=90 group by sno having count(pno)>=2 |
1 | select from_unixtime(ctime,'%Y-%m-%d') as dorderby,count(ctime) as count |
group by可以可以使用函数; 并且可以将这个参数应用到select中.
order by 使用的列的名字是对结果集和默认中选出来的.
- M和数据类型的取值范围是无关的
- M只是指明MYSQL最大可能显示的数字个数,数值的位数小于M时会有空格填充;大于M时,只要该值不超过该类型整数的取值范围,数值依然可以插入,而且能显示出来
- M的效果需要配合zerofill使用
Group By 和 Having, Where ,Order by这些关键字是按照如下顺序进行执行的:Where, Group By, Having, Order by。
首先where将最原始记录中不满足条件的记录删除(所以应该在where语句中尽量的将不符合条件的记录筛选掉,这样可以减少分组的次数),
然后通过Group By关键字后面指定的分组条件将筛选得到的视图进行分组
接着系统根据Having关键字后面指定的筛选条件,将分组视图后不满足条件的记录筛选掉
,最后按照Order By语句对视图进行排序,这样最终的结果就产生了。
在这四个关键字中,只有在Order By语句中才可以使用最终视图的列名
乐观锁
乐观锁:顾名思义总是乐观的认为这个数据没有在同一时间被其他人操作变更
实现:CAS(compare and set)
优点:吞吐量高,适用于数据冲突相对较少的场景
缺点:受限于外部系统,可能会引起脏读,且在数据冲突很大的场景下,性能反而可能更低
内存实现CAS/ABA/AtomicStampedReference/; 数据库乐观锁实现:update goods set num= newnum, version = oldversion+1 where version = oldversion;
悲观锁:
内存:lock,syncrhoized是一种独占锁.
数据库: select…for update;但是: select…for update不会阻塞select的查询。