1. 对于VACHAR类型字段 MAX(feild)不能正确得到结果。应:MAX(feild+0)
2. sql server中的TOP N,mysq不支持,可以使用limit offset length。
select * from table_name limit 0 100;
select * from table_name limit 100;
3. show processlist,查看当前执行的的sql线程,非常实用。可以通过kill id来终止指定线程
4. 多个客户端并发大量查询会导致mysql负荷越来越大,查询速度越来越慢。msyql+ memcached方案?
5. 对于大量并发insert操作,可以实用"insert delayed into",仅对MyISam引擎表支持
6. 对表可以进行锁操作:LOCK TABLES table1,table2 READ; UNLOCK TABELS;
7,. API函数mysql_data_seek(res,offset), offset越大,越耗时,在几千万数据的res中,若要重复使用该函数,注意优化。
8, 查看表状态,show status from table_name;
9, 创建索引:
CREATE INDEX ON table_name index_name(filed_name);
ALTER TABLE table ADD INDEX index_name(filed_name);
10 查看索引:
show index from table_name
11 调试
show warnings;
show errors;
12.Mysql UDF:
name()
{
}
name_init()
{
}
name_deinit()
{
}
13.Mysql Full-text,全文检索:
my.cf 重要参数:
ft_min_word_len,默认为4,最小匹配分词大小
修改后参数需要重启mysql 和 重建full-text索引,一定要注意哦
14.一些高级语法
insert into A(name,tel,address) select name,tel,address from B where id=10;
update poi A INNER JOIN poi_tmp B ON A.id=B.id set A.name=if(B.name is null,A.name,B.name);
update (select mac_id,count(*) as sum from nav_business) A INNER JOIN nav_target B ON A.mac_id=B.mac_id set B.sevice_times=A.sum;
delete poi.*,poi_tmp.* from poin LEFT JOIN poi_tmp USING(id) where id=10
15. select可以加互斥锁
如有些情况需要先select判断其条件后,再作update操作。 在多线程情况下,这样是不安全的。除非保证select和update整个过程是原子的。
这里我们使用select ... for update开始加锁,和随后的update操作放在同一个事务中,最后commit(或者rollback)释放锁,这个过程是原子的,其他事务会因为锁而阻塞。
阻塞情况可以查看:
select * from information_schema.innodb_trx