今天我们来聊聊SQL,关于SQL我一开始的想法是,我知道select,update,delete,insert就可以了,其实对于测试,日常工作中我们差不多用到这几项SQL语句。前几天我发现数据库中有个表数据太多,想要把表清空,我自然而然的就执行了DELETE FROM XXX,然后我就悲剧了,数据表被锁死了。请教了开发之后,才了解到,这个表数据太多大概有12G,使用delete性能会很慢,而且这个表一直被访问,当你清空的时候会导致数据表死锁。这个时候才知道自己对于SQL的了解真的很浅,先记录下开发大大提供的解决方法:1、create table xxx_new like xxx; 2、alter table xxx rename to xxx_old; 3、alter table xxx_new rename to xxx; 4、drop table xxx_old;(truncate table xxx)。
为了很好去了解开发大大给的SQL语句,特意去百度了一下,记录下delete,drop,truncate的区别:1、从执行速度上来说:drop>truncate>delete;2、truncate和delete只是删除表里面的数据,而drop是把整个表的结构也一起删除了;3、delete是可以回滚的,而truncate和drop是data define language是不能回滚的;
在日常写select的时候,有时会发现搜索很慢,然后这个时候去查看数据库,发现我的where里面没有索引字段。那么问题来了什么是索引,我们经常会听开发说起索引,但是对索引却是一知半解。为什么要建索引?有一次我用查询一个表根据表的title字段搜索(where titile=”XXX”),然后等了2分钟还没出结果,特纳闷。然后我看了下表结构,索引里面没有title这一项,而且表有12G(没错就是我上面要删除的那个表),然后我换了一个搜索方式,根据里面索引字段搜索,一共40S就出来了,这就是为啥要建立索引。而对于我们测试来说,知道索引更多的是了解下数据库的性能,如果可以的话,我们可以查看下开发常用的查询SQL的字段是否加了索引(然而并不是所有字段的查询都需要加索引,更多的要根据具体业务来讲),关于数据库性能更深入的内容后期再讲。
之前我在出数据库select的查询面试题时,我涉及了一个二级查询的题目。“获取room的前50个数据,先score顺序,再created_time倒序”,一开始以为这个算是个送分题,结果却发现没有人写对了,一般只写了一半。但是为啥我会出这个题目,因为在日常工作中,我们经常测试到榜单,对于测试来说榜单一定是个唯一序列。如果一个榜单是根据score排序,那么我们要想的是如果score一样时会怎么样呢?我曾经就入过这么一个坑:我和开发用同一条SQL去查询,然而我们查询出来的结果始终对不上,结果一查有两条数据的score是一样的。那为啥同一个SQL语句当order那个字段的值一样而数据会不一样呢?我还遇到过一个问题,SQL的前面是一样的,但是limit 2和limit 10的数据列表前两个值得排序是不一样的。那这又是为什么呢?SQL在查询的时候,有自己的一套机制,它会以最快的速度查出给用户想要的值,当你的其中一个查询字段内容一样且没有其他更多排序要求时,它就会按照最近拿到的数据返回给你。
关于数据库的东西有很多,很多都是在小细节上的,作为一个测试,我一直对自己强调的是千万别跟着开发的思路走,要学会自我思考,自己有一个清晰的思路,这样我们才能去发现开发逻辑中的错误。如果我们先听取开发的讲解,很容易有了先入为主的概念,那么容易被牵着鼻子走。之前开发一直不愿意加二级查询,觉得一级就够了绝对不会有问题,后来我就用数据告诉他,就算有万分之一的几率重复,我们也要防止这种情况出现(因为我们活动榜单上的排序涉及到用户的奖励,对于用户比较重要)。
最后关于数据库的内容很多,今天先讲了一些日常中遇到的坑,其他内容后期再续。希望做测试的同伴们,在日常使用中能够对自己写的SQL或者开发给SQL可以多多了解一番,虽然我们是测试,但是我们也可以和开发了解的一样多,或者比之更多。