1.生成全局唯一id
create table sequence(id int not null)
insert into sequence values(0)
update sequence set id=LAST_INSERT_ID(id+1)
select LAST_INSERT_ID()
2.第一范式是指数据库表的每一列(属性)都是不可分割的基本数据项。第二范式要求数据表里的所有数据都要和该数据表的主键有完全相依的关系,如果一个数据表的主键只有一个单一字段的话,它一定满足第二范式。第三范式的所有非键属性都只和候选键有相关性,也就是说非键属性互相之间应该是无关的,候选键一般指主键。
3.mysql的锁机制,事务隔离级别。
(1)读未提交。
(2)读已提交(解决脏读)。
(3)可重复读(解决重复读问题),使用mvvc多版本并发控制,http://www.cnblogs.com/hirampeng/p/9944200.html
(4)序列化,将普通select语句默认改成select ......lock in share mode,即为查询语句涉及的数据加上共享锁,阻塞其他事务修改真实数据,
隔离级别不能解决丢失更新问题。很重要,要通过自己加锁解决,select后加上for update,加的是排他锁,加上lock in share mode,加的是共享锁,根据索引,又分为表锁和行锁。数据库的锁技术是通过索引来实现的,如果我们的sql语句没有用到索引,InnDB将会执行全表扫描,锁定所有的行。mysql的行锁分为记录锁,间隙锁,next-key锁(记录锁+间隙锁),使用这个技术来避免幻读,比如select * from table_name where id>5 for update,mysql会锁定所有id>5的行和其他间隔。当然这跟设定的隔离级别也有关,必须是可重复读及以上。https://www.cnblogs.com/chenqionghe/p/4845693.html
4.存储过程在需要判断或循环执行多条语句的时候确实会加快速度,主要是省了io的时间,但实际上关系型数据库都需要nosql的补充,这样限制了存储过程,而且web服务器和数据库服务器一般位于同一个内网,io速度很快。触发器,外键,视图都对性能有影响,视图没有索引。
5.sql优化,没啥好说的,就是要多用索引,避免多表查询,避免子查询转化为join,union确保数据唯一的情况下union all,group by,distinct,order by也会进行排序,要使用索引,避免!=和like。
6.存储过程
declare a int default 0;
set a=1;
----------------------
if .... then
elseif ... then
else ...
end if;
-----------------------
case ...
when ... then ....
when ... then ....
else ....
end case;
----------------------
while .... do
.....
end while;
----------------------
repeat
......
until ....(没有分号)
end repeat;