1.关于网站访问计数 http://www.oschina.net/code/snippet_938918_36840?p=1
CRETE TABLE `article_view`(
`article_id` int(11) NOT NULL,
`pond` tinyint(4) NOT NULL COMMENT
'池子,就是用来随机用的'
,
`view` int(11) NOT NULL,
PRIMARY KEY (`article_id`);
)ENGINE=
INSERT INTO `article_view` (`article_id`, `pond`, `view`) VALUES (`123`, RAND()*5, 1) ON DUPLICATE KEY UPDATE `view`=`view`+1
SELECT SUM(`view`) FROM `article_view` WHERE `article_id`=
'123'
2.mysql优化 http://blog.jobbole.com/86547/
inner join查询速度比where联合要快,mysql数据库自动把where联合转成了inner join,所以效率差不多
having只有在聚合的时候才使用,其余情况下用where条件来刷选
3.find_in_set和group_concat合起来使用
因为需求是根据多重不同优先级条件判断,用IFNULL进行判断,如果用IF的话SQL语句会很长,类似下面查询特定用户的需求,先查身份证号码一致的用户,如果不存在就查姓名和手机号码一致的用户,表格中会存在重复的用户
select * from user where find_in_set(user_id,ifnull((select group_concat(user_id) from user where id_no='身份证号'),(select group_concat(user_id) from user where name='姓名' and phone='手机号码'))
4.如果不存在则插入,存在则不插入,dual是MYSQL自带的虚拟表
1) insert into table(字段) select 字段值 from dual where not exists(select * from table where 字段=字段值)
例子:insert into user(name,sex) select '刘','男' from dual where not exists(select * from user where name='刘' and sex='男')
有人提议用下面的写法,经过验证这种写法是错误的,不能使用
insert into table(字段) select 字段值 from table where !(字段=字段值) LIMIT 1
例子改写为下面的结果会插入多条记录,所以这种写法不可取:
insert into user(name,sex) select '刘','男' from user where !(name='刘' and sex='男') limit 1
如果表格中设定了主键或者唯一索引,还可以使用,replace into 和insert ignore into的写法
2)replace into user(name,sex) values('刘','男') 这种写法,如果存在相同的主键记录,则进行替换操作,内容修改了,影响行数为2,替换的内容没有改动影响行数为1;如果不存在该主键则进行插入操作,影响行数为1
3)insert ignore into user(name,sex)values('刘','男') 这种写法,如果存在相同的主键记录,则不进行任何操作,影响行数为0;如果不存在该主键则进行插入操作,影响行数为1
4) insert into table(字段) values(字段值) on duplicate key update 字段=字段
5. 类型转换
CAST(字段 AS 类型)
CONVERT(字段,类型)
6.ROUND()函数的陷阱,两个float字段相乘得到的结果会有偏差
http://blog.jobbole.com/109735/
7.对in进行排序
select * from table where id in(2,3,1) order by filed(id,2,3,1)
8.设计数据库的时候最好考虑大小写区分,尤其是要做唯一性判断的时候
mysql对于类型为varchar数据默认不区分大小写,但如果该字段以“*_bin”编码的话会使mysql对其区分大小写,现在用的utf8_bin和utf8_general_cs都是区分大小写的,但是好像部分版本的mysql没有utf_general_cs
9.不管是加不加索引 group by 都比 distinct 快,因此使用的时候建议选 group by。 结论来自http://www.cnblogs.com/zox2011/archive/2012/09/12/2681797.html,未经测试。
10.mysql连接最常见的一个错误:
The last packet successfully received from the server was 1 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.
设置数据库配置参数net_write_timeout=1800
设置数据库连接参数connectTimeout=120000 socketTimeout=120000 autoReconnect=true failOverReadOnly=false
设置以后会引发其它的错误,目前没有找到最佳的解决办法,寻求帮助中。
10.union合并查询集会去掉重复数据,包括子查询中本身重复的记录。
11.碰到一个很奇葩的问题,因为空格的问题造成了sql语法错误,我现在还没搞懂为什么,错误的sql粘贴到博客来再粘贴回去就正确了,现在只能理解为空格的编码是错误的。