编程时不能两个SELECT查询语句同时执行,必须先读取结果集后在select
intser 没有返回结果集
或者指定多条语句执行;
存储二进制流用blob类型 查询语句用 mysql_real_connect(mysql, *to,*from, size(from) )将二进制流变为字符串 因为查询语句是字符串二进制流中有特殊字符,to的大小为2*size + 1有编码不同4个位可能一个字符;
1 开启事务之前需要rollback 连接句柄。(清理垃圾)
2 mysql_ping 失败,程序需要处理重连逻辑;
3
mysql_query()执行的SQL语句是一个以‘ ’结尾的字符串,而mysql_real_query()执行的字符串长度是参数指定的,因此,前者不能不能包含二进制数据(二进制数据中可能会包含‘ ’,导致被认为到达字符串末尾)
实际使用中,推荐使用mysql_real_query
4 mysql C API?? 中SQL不需要 ';' 结尾;
5 mysql 转义;(老问题了)
6 所有update 语句,建议后边调用函数判断受影响的行数,是否是自己预期值;
7 mysql_real_connect 需要设置连接超时时间,特别是处理重连逻辑的时候,以免程序堵死;
8 程序rollback时候, 需要习惯性的校验应用的错误码,避免错误码没有赋值,调用者以为调用成功,造成漏洞;
9 多线程环境下使用libmysqlclient_r 库,非libmysqlclient 库
10 mysql_real_connect/mysql_init 多线程环境下调用需要加锁;
11 使用mysql_real_escape_string, 需要注意目标缓冲区是 2*n+1 大小;
12 mysql_store_result 这个函数是分配的内存的。 使用完需要释放,避免内存泄露;
13 mysql的事务尽量小,使用完,立即commit或rollback.不要起一个过大的事务。
14 mysql的隔离级别注意使用 Read Commited。不然会产生锁间隙的问题。
15 避免尝试去锁一个不存在的记录,for
update语句where条件请使用主键(锁定一个非主键,会默认同时锁定一个主键,这是造成很多死锁的原因)。避免过多的for
update。
16 select语句必须使用索引,where条件避免使用 or 或者在条件中运用运算表达式,会造成索引失效。
17 联合索引可以替代单独的索引。如果已有联合索引,不需要重复建立单独的索引。索引过多会导致插入变慢。注意是联合索引的第一个可以省略。
避过(f1,f2),可以省略f1的单独索引,但是不能省略f2的单独索引。
18
where条件,结果集不要太大,如果超过30%,索引会时效,会导致mysql扫描全表。不确定时,请用explain做检测。
19 mysql单表记录保持在1000W以下,以获得较好的性能。
20 mysql数据库链接数不能过多,请保持在200以下。
21 修改mysql 锁等待时间,默认为50s,避免for update等待时间超长,造成系统阻塞
innodb_lock_wait_timeout(修改这个属性需要重启数据库)
22 如果启用事务,可以不必显示的设置set
autocommit=0,即使当时autocommit模式为1(直接提交模式),可以通过begin/commit来隐式的调用。
?? 如果不使用事务,则必须显示的调用 set autocommit=1.因为不能确定,是否某长链接中,有人设置了set
autocommit=0. (事务性,单条sql也最好显式开启事务