欢迎来到天天文库
浏览记录
ID:30786465
大小:185.21 KB
页数:8页
时间:2019-01-03
《mysql数据库规范》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、MySQL数据库规范目录1.sql语句编写2.explain工具的使用--重点1.sql语句编写SQL编写1.执行大的delete,update>insert操作要慎重,特别是对业务繁忙的系统,要尽量避免对线上业务产生影响。解决办法是:大操作切割为小操作,使用limit子句限制每次操作的记录数,也可以利用一些日期字段基于更小粒度的时间范围进行操作。2.避免使用select*语句,select语句之用于获取需要的字段。3.使用预编译语句,可以提高性能并且防范sql注入攻击。4.一般情况下update,delete语句中不要使用limito
2、5.where条件语句中必须使用合适的类型,避免mysql进行隐式转换。6.insertinto必须显式指明字段名称,不要使用insertintotable()o7•避免在sql语句中进行数学运算或函数运算,避免将业务逻辑和数据存储耦合在一起。8.insert语句如果使用批量提交,如insertintotablevalues(),()...那么values的个数不应过多。一次性提交过多记录,会导致I/O紧张,出现慢查询。9.避免使用存储过程、触发器、函数等,这些特性会将业务逻辑与数据库耦合在一起,并且MySQL的存储过程,触发器,函数中
3、可能存在bug。10.尽量避免使用子查询,连接。尽量将子查询转化为连接查询,mysql查询优化器会优化连接查询,但连接的表要尽可能的少,如果很多,可以考虑反范式设计。即对设计阶段做一些改造。11.使用合理的sql语句以减少与数据库的交互次数。12.建议使用合理的分页技术以提高操作效率。2.explain工具的使用explain工具的作用1.使用explain工具可以确认执行计划是否良好,查询是否走了合理的索引。2.不同版本MySQL优化器各有不同,一些优化规则随着版本的发展可能有变化,査询的执行计划随着数据的变化也可能发生变化,这类情况
4、就需要使用explain来验证自己的判断。explain工具实操执行如下脚本,观察控制台输出explainselectnamefromtestwhereid=32;注意数据表使用如下脚本:CREATETABLE'test'('id'int(ll)unsignedNOTNULLAUTO_INCREMENT,'name'varchar(11)DEFAULTNULL,PRIMARYKEYCid'))ENGINE二InnoDBAUT0_INCREMENT=41DEFAULTCHARSET二utf8;tablename=test>columnl=
5、id、column2=name.执行结果如下所示:mysql>explainselec七namefrom七estwhereid=f丄•1w/W4”41LUqselect_type:丄^SIMPLE七abl€:__test十宀5■上I———.■k111I1partitions:MnUl±type:possible.keys:key:key_len:ref:rows:filtered;Extra:constPRIMARYPRIMARY4const1100,00:NULL1rowinset,1warning(0.00sec)下面详细阐述exp
6、lain输出的各项内容:id:包含一组数字,表示查询中执行select子句或操作表的顺序。如果id相同,则执行顺序由上到下。select_type:表示查询中每个select子句的类型(是简单还是复杂)输出结果类似如下:1.simple查询中不包含子查询或者union2.primary査询中若包含任何复杂子査询,最外层査询被标记为primary3.subquery在select或where列表中包含了子查询,则该查询被标记为subquery1.derived在from列表中包含的子查询被标记为derived(衍生)2.union若第二个
7、select出现在union之后,则被标记为derived。3.unionresult从union表中获取结果的select将被标记为unionresultoselect_type只需要了解分类即可,这个信息并不是最有价值的。type:最有价值信息之一type表示MySQL在表中找到所需行的方式,又称为“访问类型”,常见的类型如下所示:all、index、range、ref、eq_ref>const,system,null以上类型,由左至右,由最差到最好。all:FullTableScan,MySQL将遍历全表以找到匹配的行。index
8、:FullIndexScan,index与all区别为index类型只遍历索引树。假设表中有主键字段id,则selectidfromtable_name;type即为FullIndexScanorange:
此文档下载收益归作者所有