一句SQL语句,可能就是一个定时炸弹

一句小小的SQL语句,在数据量很小的时候,可能是一句相当完美的语句。但是随着数据量的不断增加,你是否能想到他带来的灾难性的后果呢?那么,什么样的SQL语句才算好的语句呢?

对于SQL语句,很多人上来就是select *,不用想,对于数据量大的表来说,这样的语句无非是致命的。而一个好的数据库管理员,在设计数据库时,就应该想到当数据量很大很大时,就应当有所准备。

最近在做一个查询统计, 因为一直用本机的数据库,数据量不是很大,即使查询时等1s也没什么感觉,但是当连接到真正的数据库上,那等待的感觉,只能用一个词来形容。煎熬。没办法,这样的系统哪个用户敢用啊。卡都卡爆了。最后把那条SQL语句放到真实的数据库中执行。灾难来临,直接卡死。数据库瘫痪。数据是1秒一添加的。可想而知数据量有多大了。只能优化SQL语句了,光优化SQL语句还是不行的。还得想想其他办法。

所以,SQL语句慎用,数据库的优化很重要,是每一个“优秀”程序员必须要会的。

这个问题到底如何解决的呢?其实解决办法很多,看你对数据库的了解程度了。我是了解的不深刻,只能跟着大牛学习学习了。

因为我们的数据是实时监测数据,数据更新很快,但是就是为了防止第一次启动时没有数据,所以进行了初始化,执行了这条SQL语句。导致我们重启以后,可以说是再也启不来了。它害死了整个系统。所以我们干脆就不执行这条SQL语句了,初始化时直接给他个初值。直接毙掉。实时数据会存入字典里,所以我们只需要在字典里查询我们需要的数据。

这个办法当然是无可奈何的。数据库的优化蕴含着很深的学问。在工作中、学习中要多多积累经验,敢于尝试,敢于去优化。对于数据库,是从2013年6月开始接触的,但是一直停留在基础层次,从未有所长进。我是这么觉得的,但是回过头来看看自己的博客,不管是存储过程还是视图、触发器自己都用过,也都会用。我停留在哪了么?我差在哪里了。说对了。我不会优化。大数据优化,对于我来说是个高大上的词,我畏惧他。

项目马上快验收了,效率这么低,经理请来一个10年专供数据库的人来解决效率问题,他通过表分区进行优化。重构了数据库。其实这些在开发的时候就应该想到的,等项目快上线了再动数据库确实有点不妥了。

下班以后,我也百度一下,多学习一下数据库的优化,这个要学好了,我也要学着让自己成为大牛,哈哈。

对于数据库的优化,有很多我们需要学习的,也有很多注意的。这得在项目实践中多多积累。我所了解的一丢丢,万事都从一丢丢开始,不可能一下子一口吃个胖子。

所以,对于数据库的使用,我们要考虑很多,尤其是性能。我们要多接触这方面的知识。比如:你是否知道select *的坏处,*无非是查询所有列了。这是多么耗费时间你是知道的。对于你写的每一句SQL语句都要深思熟虑看,考虑一下后果。我们还可以减少访问数据库的次数,能不直接从库里取数据就不拿。还可以使用索引,提高检索数据的效率,但是索引需呀存储空间,并且要定期维护,索引要加的适量并且准确。否则不必要的索引同样影响效率。我们还要避免在索引上使用计算。

数据库的优化,是我们每个人需要会的。我了解的太少了,得在工作中多多积累经验,让以后的项目中,从一开始,就把性能问题考虑进去,多一份思考。性能问题应该受到重视。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-26 17:14:34

一句SQL语句,可能就是一个定时炸弹的相关文章

select count(1) from table where ..这句sql语句的作用

作用是计算一共有多少符合条件的行.1并不是表示第一个字段,而是表示一个固定值,count(1)和count(2)效果是一样的 count(*),执行时会把星号翻译成字段的具体名字,效果也是一样的,不过多了一个翻译的动作,比固定值的方式效率稍微低一些.count(字段值),将返回符合条件的非空数量 1.查询所有数据,列出7列数据 2.使用count(1)查询结果,返回7 3.使用count(*)查询结果,返回7 4.括号中是表中的字段值,count(字段值),返回表中非空的C_Id字段下的数据数量

使用ODP.NET一次执行多句SQL语句

在实际开发的时候有的时候希望一次执行多句SQL语句,又不想使用Transcation的话,可以直接将多句SQL语句拼接起来.例如: var sql = "Begin " + "Update tabUser Set UserName = :UserName Where UserId = :UserId; " + "Update tabUser Set UserPassword = :UserPassword Where UserId = :UserId An

php函数mysql_query批量执行多句sql语句

正常情况下用php的mysql_query函数是不能批量执行多句CREATE TABLE之类的语句的: 而有些场景:比如说有一个sql备份文件.又或是程序初始化时创建数据表结构的时候需要批量执行文件中的sql语句: 解决这个问题可以用explode函数按';'号把sql语句拆成数组:再通过循环执行mysql_query即可:因为每句sql都是以';'号结束的: 但是考虑到sql语句中可能有实体符号  之类的:如果按';'号来拆:容易误伤:所以用preg_split正则来拆更靠谱: 示例环境: s

用一句sql语句更新两个表并可更新对应的字段的值

ACCESS 例子: insert into products (ProNumber,CASNumber,Cnname,Price,Enname,Baozhuang,Pinpai) select ProNumber,CASNumber,Cnname,Price,Enname,Baozhuang,Pinpai from product22 1.用一句sql从一个表里面取出数据导入另外一个表里面.这个对不同程序之间的数据转换很有用处,而且速度快,数据完整: insert into table1 (c

SQLServer用sql语句怎么返回一个月所有的天数

可用如下sql语句: select convert(varchar(10),dateadd(DAY,t2.number,t1.day),120) day from (select '2015-07'+'-01' day) t1, (select number from MASTER..spt_values WHERE TYPE='P' AND number>=0 and number<=31) t2 where convert(varchar(10),dateadd(DAY,t2.number

JDBC连接MYSQL,批量执行SQL语句或在执行一个SQL语句之前执行一个SQL语句

conn = MysqlJdbcUtils.getConnection(); Statement ps=conn.createStatement(); ps.addBatch("truncate QB_ShowCount_Asite_copy"); ps.executeBatch(); String SrcSql = "select convert(unhex(hex(convert(Community using latin1))) using utf8) as Commu

SQL语句是以一个patch为单位编译

如下语句如果不加go的话,当做一个批处理编译时会报错,提示没有split_count和split_amount列.加了go时可以一起执行 --3.Kit split in sale_detail: split_count,split_amount ALTER TABLE sale_detail ADD split_count INT,split_amount float go --EXECUTE TIME 40 minute UPDATE ssd SET ssd.split_count=tt.s

IT忍者神龟之一句sql语句——连接同一字段的所有值

Oracle可以用SYS_CONNECT_BY_PATH字符串聚合函数: SELECT LTRIM(MAX(SYS_CONNECT_BY_PATH(productname, ', ')), ', ') AS productname FROM( SELECT '1' as id, productname, ROW_NUMBER() OVER (PARTITION BY '1' ORDER BY productname) AS curr, ROW_NUMBER() OVER (PARTITION B

逻辑很重要:一句sql语句的事,自己却想了半天,绕了个大弯子

问题:系统升级后审核认证信息分别写入两个表,现在需要链接用户表和相应的新旧审核表获取字段值? 钻进胡同里:一直纠结于升级之后的会员信息从新表查,升级之前的数据从旧表查,纠结于根据时间戳分条件判断, 其实,只要把新旧两个审核表合并成一个表就可以了,直接从新生成的表里面查询即可! SELECT !ISNULL(ia.approve_stat) ispost,FROM_UNIXTIME(ia.first_approve_time,'%Y-%m-%d %H:%i:%s') first_approve_t