当前位置: 首页 > 科技观察

SQL自动审核-自助在线平台

时间:2023-03-12 04:44:03 科技观察

为了将DBA从日常繁琐的工作中解放出来,通过SQL自助平台,自动上线开发。开发提交SQL后,自动返回优化建议,无需DBA重新审核。这样,提高了线上效率,有利于建立数据库开发规范。借鉴去哪儿网Inception的思路,集成美团SQLAdvisor(索引优化建议),结合之前写的《DBA的40条军规》进入审核规则,用PHP实现。目前在我公司使用。SQL自动审计主要有两个目的:1.防止性能不佳的SQL进入生产系统,导致整体性能下降。2、检查开发设计的指标是否合理,是否需要增加指标。思路其实很简单:1.获取开发提交的SQL2,分析要执行的SQL,触及预定义的规则,判断SQL是否可以自动通过,不通过的需要人工处理审计。以下是首页界面:使用说明:1.新增select/insert/update/create/alter规则,delete需要审批。2.句子之间一定要有空格,比如whereid=100,没有空格会影响判断的准确性。3、SQL语句后加分号;MySQL解析器规定分号可以执行SQL。4、反引号`可能会导致联机失败,需要用文本编辑器替换。5.支持多条SQL分析,用######六个井号分隔。SELECT审计1.开发者可直接提交SQL语句给平台进行风险评估2.平台分析SQL语句,自动给出不符合开发规范的改进建议3.适用场景:应用开发阶段检查项目:1.select*是否需要查询所有字段?2.警告!没有where条件,注意where后面的字段加索引3,没有限制会查询更多的数据4,警告!子查询性能低,请改用jointableassociation5.提示:in中的值不要超过10006.提示:使用joinassociation,注意给关联字段加索引,比如在a.id=b上。id7,提示:MySQL对多表joinassociation的性能较低。建议关联的表不要超过3个。8.警告!像'%%'双百分号不能使用索引,像'mysql%'可以使用索引。9.提示:默认情况下,MySQL对所有GROUPBYcol1,col2...字段进行排序。如果查询包含GROUPBY并且你想避免使用排序后的结果,你可以指定ORDERBYNULL来禁用排序。10.警告!MySQL中使用的orderbyrand()在数据量很大的时候非常慢,因为会导致MySQL扫描整张表,所以索引就用不上了。11.提示:要加having滤镜吗?12.警告!禁止不必要的排序排序,因为前面已经统计了13个。警告!MySQL不支持函数索引。例如DATE_FORMAT('create_time','%Y-%m-%d')='2016-01-01'不能使用索引,需要改写为create_time>='2016-01-0100:00:00'andcreate_time<='2016-01-0123:59:59'会调用美团点评SQLAdvisor查询索引。使用概述:1.选择你的数据库名称2.在对话框中输入你要提交的SQL3,点击提交审核按钮提交,系统会自动返回SQL优化改进建议。插入审计检查项目:1.警告:inserttable1selecttable2会造成表锁。审核通过后,会弹出用户名和密码,提示上线:点击我要上线按钮,会调用MySQL客户端检查语法和表是否存在。更新审计检查项目:1.警告!如果没有where条件,update会更新整张表,禁止执行!!!2、如果更新行数小于10000行,可以自行开发执行。否则请联系DBA实施!!!为了防止where1=1绕过审计规则,必须写一个真实的where条件,才能进行update操作。在线成功的SQL会记录在一个操作日志表中,记录binlog位置,方便以后回滚操作。创建审计检查项目:1.警告!该表没有主键2。警告!表的主键要自增,缺少AUTO_INCREMENT3,提示:id自增字段默认值为1,auto_increment=14,警告!表没有索引5,警告!表中的索引数量已经超过了5个,索引是一把双刃剑。它可以提高查询效率,但也会降低插入和更新的速度,占用磁盘空间。6.警告!表字段没有中文注释,COMMENT应该有默认值,比如COMMENT'name'7.警告!表上没有中文注释8.警告!该表缺少utf8字符集,否则会出现乱码9.警告!表存储引擎应设置为InnoDB10,警告!该表应该是时间戳类型加上默认的系统当前时间。审核通过后,即可上线。在线失败提示:alterauditcheckitems:1.警告!不支持createindex语法,请更改为altertableaddindex语法。2.警告!改变表结构,减少与数据库的交互次数,应该改为,比如altertablet1addindexIX_uid(uid),addindexIX_name(name)3.表记录小于100万条行,可由开发自助服务执行。否则表太大,请联系DBA执行!数据库在线工单查询(只记录执行成功的SQL)