一些能体现个人水平的 SQL 语句 [总结篇]作为一名小小的开发人员,刚入门的时候觉得很难,过了一段时间之后,发现很简单,很快就可以搞定很 bug 了。然而这并不能说明你就已经很牛掰了,只能说,你不了解其他太多的东西。应该说,数据库有几个共同的命令,select , update , insert, replace, delete , truncate, drop,只要你学会了,你就感觉你可以为所欲为了。但是在这里,我要总结一些体现水平的语句,而这些东西恰好直接体现你个人的水平和经验问题。 1、show processlist :查看 mysql 的进程情况,在网站很慢的时候,你应该要想到是不是有很多死的进程或者很耗时的进程,如果确实是这样,那你应该结束到一些。kill 99 . 执行状态分析: Sleep 状态通常代表资源未释放,如果是通过连接池,sleep 状态应该恒定在一定数量范围内, 实战范例:因前端数据输出时(特别是输出到用户终端)未及时关闭数据库连接,导致因网络连接速度产生大量 sleep 连接,在网速出现异常时,数据库 too many connections 挂死Waiting for net, reading from net, writing to net 偶尔出现无妨, 如大量出现,迅速检查数据库到前端的网络连接状态和流量 案例: 因外挂程序,内网数据库大量读取,内网使用的百兆交换迅速爆满,导致大量连接阻塞在 waiting for net,数据库连接过多崩溃 Locked 状态, 有更新操作锁定, 通常使用 innodb 可以很好的减少 locked 状态的产生,但是切记,更新操作要正确使用索引,即便是低频次更新操作也不能疏忽。如上影响结果集范例所示。在 myisam 的时代,locked 是很多高并发应用的噩梦。所以 mysql 官方也开始倾向于推荐 innodb。 Copy to tmp table 索引及现有结构无法涵盖查询条件,才会建立一个临时表来满足查询要求,产生巨大的恐怖的 i/o 压力。很可怕的搜索语句会导致这样的情况,如果是数据分析,或者半夜的周期数据清理任务,偶尔出现,可以允许。频繁出现务必优化之。 Copy to tmp table 通常与连表查询有关,建议逐渐习惯不使用连表查询。 实战范例: u某社区数据库阻塞,求救,经查,其服务器存在多个数据库应用和网站,其中一个不常用的小网站数据库产生了一个恐怖的 copy to tmp table 操作,导致整个硬盘 i/o 和 cpu 压力超载。Kill 掉该操作一切恢复。 Sending data Sending data 并不是发送数据,别被这个名字所欺骗,这是从物理磁盘获取数据的进程,如果你的影响结果集较多,那么就需要从不同的磁盘碎片去抽取数据,偶尔出现该状态连接无碍。回到上面影响结果集的问题,一般而言,如果 sending data 连接过多,通常是某查询的影响结果集过大,也就是查询的索引项不够优化。 如果出现大量相似的 SQL 语句出现在 show proesslist 列表中,并且都处于 sending data 状态,优化查询索引,记住用影响结果集的思路去思考。 Storing result to query cache 出现这种状态,如果频繁出现,使用 setprofiling 分析,如果存在资源开销在 SQL 整体开销的比例过大(即便是非常小的开销,看比例),则说明 query cache 碎片较多, 使用 flush query cache 可即时清理,也可以做成定时任务 Query cache 参数可适当酌情设置。 Freeing items 理论上这玩意不会出现很多。偶尔出现无碍, 如果大量出现,内存,硬盘可能已经出现问题。比如硬盘满或损坏。 i/o 压力过大时,也可能出现 Free items 执行时间较长的情况。 Sorting for和 Sending data 类似,结果集过大,排序条件没有索引化,需要在内存里排序,甚至需要创建临时结构排序。 其他还有很多状态,遇到了,去查查资料。基本上我们遇到其他状态的阻塞较少,所以不关心 2、checksum在逻辑备份时候前后是否可以用于验证数据一致性; load data [local] infile $filenameINTO TABLE table_name TERMINATED BY ',', 从文件导入数据到数据库中。 指定 Windows路径名时,使用的是斜线而不是反斜线。如果要用反斜线,必须双写。 出于安全的原因,当读取位于服务器上的文本文件时,文件必须位于数据库目录下或者可以被所有用户读取。也就是说,当对服务器上的文件执行 LOAD DATA INFILE时,用户必须获得 FILE权限。 3、索引:不必要的索引只会占用空间和时间,建立必要索引,唯一索引,主键索引。 4、联表操作:更新,updatetable1 t1 left join table2 t2 on t1.uid=t2.uid set t1.name=t2.name,t1.desc='**x' where t1.date='2015-10-11'; 删除:delete t1,t2,t3from table1 t1 left join table2 t2 on t1.uid=t2.uid inner join table3 t3 ont2.uid = t3.uid where t1.date='2015-10-11'; 事务:set@@autocommit=0; 5、group by 多个字段的涵义,我本人曾想当然的认为,group by 是将数据组合起来,也就是说,假如第一个是相同的,后面就不用再分了,其实不是这样的,group by 不止有组合的作用,还有拆分的作用,即第一个相同,第二个不同,也会形成两行数据,这样就很符合我们想要的组合了! 6、like 语法, 通常,like'%test%'就够了, 但是如果某个字段存在'\': 这样的写法 like '%\%', 以及 like '%\\%'都是不正确的。正确的写法是 like '%\\\\%'、原因:反斜线符号会被语法分析程序剥离一次,在进行模式匹配时,又会被剥离一次,最后会剩下一个反斜线符号接受匹配,偶的神呐! 7、判断某个字段是否存在的 SQL,在每个语言中都可以这样去实现,DESCRIBE 表名 字段名; 如果返回数组,则存在该字段,否则不存在该字段,可用于避免直接调用而产生的意外错误。 不要害怕今日的苦,你要相信明天,更苦! http://www.cnblogs.com/yougewe/p/4928786.html sohu-dba 本文转载自:微信公众账号 - SOHU-DBA,版权归原作者所有! |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|