殊不知,在N年前被奉为“圣经”的数据库设计3范式早就已经不完全适用了。这里我整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用。    由于MySQL数据库是基于行(Row)存储的数据库,而数据库操作 IO 的时候是以 page(block)的方式,也就是说,如果我们每条记录所占用的空间量减小,就会使每个page中可存放的数据行数增大,那么每次 IO 可访问的行数也就增多了。反过来说,处理相同行数的数据,需要访问的 page 就会减少,也就是 IO 操作次数降低,直接提升性能。此外,由于我们的内存是有限的,增加每个page中存放的数据行数,就等于增加每个内存块的缓存数据量,同时还会提升内存换中数据命中的几率,也就是缓存命中率。一、数据类型选择     数据库操作中最为耗时的操作就是 IO 处理,大部分数据库操作 90% 以上的时间都花在了 IO 读写上面。所以尽可能减少 IO 读写量,可以在很大程度上提高数据库操作的性能。    我们无法改变数据库中需要存储的数据,但是我们可以在这些数据的存储方式方面花一些心思。下面的这些关于字段类型的优化建议主要适用于记录条数较多,数据量较大的场景,因为精细化的数据类型设置可能带来维护成本的提高,过度优化也可能会带来其他的问题:1.数字类型:非万不得已不要使用DOUBLE,不仅仅只是存储长度的问题,同时还会存在精确性的问题。同样,固定精度的小数,也不建议使用DECIMAL,建议乘以固定倍数转换成整数存储,可以大大节省存储空间,且不会带来任何附加维护成本。对于整数的存储,在数据量较大的情况下,建议区分开 TINYINT / INT / BIGINT 的选择,因为三者所占用的存储空间也有很大的差别,能确定不会使用负数的字段,建议添加unsigned定义。当然,如果数据量较小的数据库,也可以不用严格区分三个整数类型。2.字符类型:非万不得已不要使用 TEXT 数据类型,其处理方式决定了他的性能要低于char或者是varchar类型的处理。定长字段,建议使用 CHAR 类型,不定长字段尽量使用 VARCHAR,且仅仅设定适当的最大长度,而不是非常随意的给一个很大的最大长度限定,因为不同的长度范围,MySQL也会有不一样的存储处理。3.时间类型:尽量使用TIMESTAMP类型,因为其存储空间只需要 DATETIME 类型的一半。对于只需要精确到某一天的数据类型,建议使用DATE类型,因为他的存储空间只需要3个字节,比TIMESTAMP还少。不建议通过INT类型类存储一个unix timestamp 的值,因为这太不直观,会给维护带来不必要的麻烦,同时还不会带来任何好处。4.ENUM & SET:对于状态字段,可以尝试使用 ENUM 来存放,因为可以极大的降低存储空间,而且即使需要增加新的类型,只要增加于末尾,修改结构也不需要重建表数据。如果是存放可预先定义的属性数据呢?可以尝试使用SET类型,即使存在多种属性,同样可以游刃有余,同时还可以节省不小的存储空间。5.LOB类型:强烈反对在数据库中存放 LOB 类型数据,虽然数据库提供了这样的功能,但这不是他所擅长的,我们更应该让合适的工具做他擅长的事情,才能将其发挥到极致。在数据库中存储 LOB 数据就像让一个多年前在学校学过一点Java的营销专业人员来写 Java 代码一样。二、字符编码     字符集直接决定了数据在MySQL中的存储编码方式,由于同样的内容使用不同字符集表示所占用的空间大小会有较大的差异,所以通过使用合适的字符集,可以帮助我们尽可能减少数据量,进而减少IO操作次数。1.纯拉丁字符能表示的内容,没必要选择 latin1 之外的其他字符编码,因为这会节省大量的存储空间2.如果我们可以确定不需要存放多种语言,就没必要非得使用UTF8或者其他UNICODE字符类型,这回造成大量的存储空间浪费3.MySQL的数据类型可以精确到字段,所以当我们需要大型数据库中存放多字节数据的时候,可以通过对不同表不同字段使用不同的数据类型来较大程度减小数据存储量,进而降低 IO 操作次数并提高缓存命中率三、适当拆分     有些时候,我们可能会希望将一个完整的对象对应于一张数据库表,这对于应用程序开发来说是很有好的,但是有些时候可能会在性能上带来较大的问题。    当我们的表中存在类似于 TEXT 或者是很大的 VARCHAR类型的大字段的时候,如果我们大部分访问这张表的时候都不需要这个字段,我们就该义无反顾的将其拆分到另外的独立表中,以减少常用数据所占用的存储空间。这样做的一个明显好处就是每个数据块中可以存储的数据条数可以大大增加,既减少物理 IO 次数,也能大大提高内存中的缓存命中率。    上面几点的优化都是为了减少每条记录的存储空间大小,让每个数据库中能够存储更多的记录条数,以达到减少 IO 操作次数,提高缓存命中率。下面这个优化建议可能很多开发人员都会觉得不太理解,因为这是典型的反范式设计,而且也和上面的几点优化建议的目标相违背。四、适度冗余为什么我们要冗余?这不是增加了每条数据的大小,减少了每个数据块可存放记录条数吗?确实,这样做是会增大每条记录的大小,降低每条记录中可存放数据的条数,但是在有些场景下我们仍然还是不得不这样做:被频繁引用且只能通过 Join 2张(或者更多)大表的方式才能得到的独立小字段这样的场景由于每次Join仅仅只是为了取得某个小字段的值,Join到的记录又大,会造成大量不必要的 IO,完全可以通过空间换取时间的方式来优化。不过,冗余的同时需要确保数据的一致性不会遭到破坏,确保更新的同时冗余字段也被更新五、尽量使用 NOT NULLNULL 类型比较特殊,SQL 难优化。虽然 MySQL NULL类型和 Oracle 的NULL 有差异,会进入索引中,但如果是一个组合索引,那么这个NULL 类型的字段会极大影响整个索引的效率。此外,NULL 在索引中的处理也是特殊的,也会占用额外的存放空间。很多人觉得 NULL 会节省一些空间,所以尽量让NULL来达到节省IO的目的,但是大部分时候这会适得其反,虽然空间上可能确实有一定节省,倒是带来了很多其他的优化问题,不但没有将IO量省下来,反而加大了SQL的IO量。所以尽量确保 DEFAULT 值不是 NULL,也是一个很好的表结构设计优化习惯。

相信很多人都跟小编一样不管是什么账号,如果很久不用就会忘记登录密码,像数据库SQL Server2008也一样有用户名和登录密码,下面小编就分享一下如何找回或修改SQL Server2008密码前提是你有服务器网络管理员管理权限1、首先以超级管理员administrator账户登录到电脑,然后打开据库SQL Server2008至登录界面,然后选择windows身份验证(注意:必须是超级管理员账户哦,否则是无法使用windows身份验证登录的)2、登录进去后找到安全性菜单,然后在登录名中找到你要修改的用户,这里以"sa" 账号为例3、双击sa账户弹出修改密码的窗口,然后选择“常规”在密码输入框中重新输入密码即可4、如果发现还是无法登录的情况,请回主界面在左边的列表中选择第一项,然后单击鼠标右键,选择属性5、在弹出的对话框中找到安全性,然后在服务器身份验证中选择“SQL Server和windows身份验证”,登录审核选择“仅限失败的登录”。如果管理员帐号误删了可以参考下面的方法今天有朋友问到如题目所示的问题,一时之间还真不好回答,做了好几个实验,终于搞定,方法如下,供大家参考:问题描述:朋友的SQLSERVER2008有可能在安装时没有添加当前账号作为管理员,或者后来将domain\administrator从SQLSERVER的“登录”中删除掉了,反正他是无法用管理员账号进入SQLSERVER里面了,而sa账号的密码也不幸被他给忘了。操作关键点:想办法添加新有的权限的账号,用到sqlservr -m和sqlcmd操作步骤:1.停止数据库服务2.以单用户模式启动,不知道的同学自己搜一下sqlservr.exe,看这个文件存在哪个目录里,然后以命令行调用,加上-m参数,即sqlservr -m3.登录sqlserver,个人喜欢用sqlcmd,执行命令为:sqlcmd回车4.这时候就进来了,按如下命令操作C:\Users\Administrator>sqlcmd1> create login anyang with password='[email protected]23'2> go1> sp_addsrvrolemember 'anyang','sysadmin'2> go此时,就会在系统中添加了一个名为anyang的数据库管理员账号5.结束sqlcmd和sqlservr -m的窗口,重新启动SQLSERVER服务,用anyang登录6.按下图操作,在“登录”中添加windows的管理员账号,并且授予sysadmin权限。

一、安装oracle11g数据库:       在Winserver 2012 R2 操作系统安装oracle数据库前,需要先启动系统本地的.net framework3.5服务功能,注意不是下载.net framework3.5安装,而是系统自带该服务,只不过处于禁用状态。启动服务器.net framework3.5的具体步骤:服务器管理器——>添加功能和角色——>下一步,默认至功能项,选择启动.net framework3.5即可。       接下来,按常规步骤安装oracle。二、oracle自定义表空间及数据表创建    //第一步:查看数据库表空间位置 select t1.name,t2.name from v$tablespace t1,v$datafile t2 where t1.ts# = t2.ts#; //第二步:创建临时及默认表空间 create temporary tablespace spacename_temp tempfile 'E:\APP\ADMINISTRATOR\ORADATA\ORCL\spacename.DBF' size 50m autoextend on next 50m maxsize 20480m extent management local; create tablespace spacename logging datafile '第一步的路径\tablespacename.DBF' size 50m autoextend on next 50m maxsize 20480m extent management local; //第三步:创建用户并指定表空间 create user username identified by password default tablespace spacename temporary tablespace spacename_temp; //第四步:给用户授予权限 grant dba,connect,resource to username;以上所述是小编给大家介绍的winserver 2012R2 安装oracle及创建表流程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

1.mysql中or语法的使用,在mysql语法中or使用注意点。 项目遇到坑,遍历发放奖励数据查询错误!!!$sql = 'SELECT * FROM `vvt_spread_doubleegg_exchange_award` AS p WHERE p.`act_type` = 4 or p.`act_type` = 5 AND p.`user_id` = ' .$user_id ;sql中的or语法一般用于多个条件的查询,上面的语法查询的相当于:两个sql查询出来的数据集合。 $sql = 'SELECT * FROM `vvt_spread_doubleegg_exchange_award` AS p WHERE p.`act_type` = 4; $sql = 'SELECT * FROM `vvt_spread_doubleegg_exchange_award` AS p WHERE p.`act_type` = 5 AND p.`user_id` = ' .$user_id;2. 要想查询act_type = 4 and user_id = 11123 或者等于 p.`act_type` = 5 and user_id = 11123的数据集合 or两边的条件一定要加()。$sql = 'SELECT * FROM `vvt_spread_doubleegg_exchange_award` AS p WHERE (p.`act_type` = 4 or p.`act_type` = 5) AND p.`user_id` = ' .$user_id ;总结以上就是本文关于MySQL中or语句用法示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:MySQL 语句注释方式简介、sql和MySQL的语句执行顺序分析、mysql in语句子查询效率慢的优化技巧示例等,有什么问题可以随时留言,小编会及时回复大家的。感谢朋友们对脚本之家网站的支持!

今天看一个水友说他的MySQL现在变的很慢。问什么情况时。说单表超过2个G的一个MyISAM。真垃圾的回答方式。    简单答复:换一个强劲的服务器。换服务器很管用的:)………       最终让取到慢查询:  SELECT * FROM pw_gbook WHERE uid='N' ORDER BY postdate DESC LIMIT N,N; SELECT * FROM pw_gbook WHERE uid='N' ORDER BY postdate DESC LIMIT N,N;如:   SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 1275480,20; SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 1275480,20;        看到这个语句我都吐血了(BT的PHPWIND分页啊,这个语句是PHP初学者写出来的还正常,但PHPWIND那么成熟的社区了还有这样的问题)。        我这里简单说一下LIMIT的原理。这里以LIMIT N,M为基础:LIMIT首先要找查N+M行,然后从N行处,取M行。那么这样的SQL对一次查询1275500一个操作应该是一个昂贵的开销。对于LIMIT这类的优化,第一个目标就是让N变的尽可能的小或是不用。     怎么才能使这个N尽可能小呢。我们能做的其实就是用相对的值,给分页一个提示。如现在我们看的是第5页,看完看想看第6页,第6页同样显示是20条记录。我们就可以想到,以这个例子为准:我们可以肯定的是第6页的日值应小于第5页的,如果第5页的最小日值为:2009-11-4,那我们就可以用:    SELECT * FROM pw_gbook WHERE uid='48' and postdate<'2009-11-1' ORDER BY postdate DESC LIMIT 20; SELECT * FROM pw_gbook WHERE uid='48' and postdate<'2009-11-1' ORDER BY postdate DESC LIMIT 20;这样来查询第6页的内容。同样对于查看第4页的内容(假设第5页的最大日期为:2009-11-3)则第4页的内容为:  SELECT * FROM pw_gbook WHERE uid='48' and postdate>'2009-11-3' ORDER BY postdate DESC LIMIT 20; SELECT * FROM pw_gbook WHERE uid='48' and postdate>'2009-11-3' ORDER BY postdate DESC LIMIT 20;         这是一个基本的思想。接下来讨论一下怎么展现的问题。         再说一下这种业务的SQL怎么实现:对于分页的展示可以用多用类型。这里说三种常用的类型:第一种:显示“上一页” “下一页”这种类型         这种方式相对简单也就出现了我们看到那种SQL不思考的写法。合理的做法:         第一页:     SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 20; SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 20;         第二页:根据第一页的postdate进行查询如:      SELECT * FROM pw_gbook WHERE uid='48'  and postdate<'2009-11-3'  ORDER BY postdate DESC LIMIT  20;       SELECT * FROM pw_gbook WHERE uid='48'  and postdate<'2009-11-3'  ORDER BY postdate DESC LIMIT  20;         为什么说这个简单呢,这个不存在跳页的问题。接下来这种就存在一个跳页的问题了。第二种:显示 “ 1,2,3,4,5…”         第一页: 还是以第一页的方式实现:         SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 20; SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 20;         第二页:和原来一样。如果跳页,如从第二页跳到第5页,这里有一个第二页的最小日期为:2009-11-3(假设值,可以由第二页的程序查询得到),第二到第5,差2页,每页20条记录,那么就可以用:SELECT * FROM pw_gbook WHERE uid='48' and postdate<'2009-11-3' ORDER BY postdate DESC LIMIT 40,20;SELECT * FROM pw_gbook WHERE uid='48' and postdate<'2009-11-3' ORDER BY postdate DESC LIMIT 40,20;        看到这里明白为什么大型网站的分页不是一下标识出来完了,让都能点了吧。也不会给你一个框让你输入一个页跳过去了。如果跳的页面过多,也就存在N值过大的问题了。所以要想办法必免。第三种:显示 “1,2,3,4,5,…. 末页” 或是 “首页,<<100,101,102,103 >>末页”这里有一个特殊的一地方:别的页面的跳转的上面一样。这里就加一个末页,这里又分两种情况,如果知道最后一页是多少页,也就知道了前一页的最小日期(分页提示值),这样就可以用上面的方法查看最后一页的内容(会出现不足20条的现象),另一种,我就不知道最后是第几页,我就是想看看最后什么样子,那么就可以用(一定是显示20条):SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate ASC limit 20; SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate ASC limit 20;         首页这里就不在说了。                具体怎么实现搞明白了,就可以做PHP代码的修改了。稍稍修改一下,就会带来意想不到的效果。 这里只是一个通用的分页处理方法。不同的业务有可能还有不同的方法处理。如果在条件可能和情况可以考用:between … and .. 带代替limit分页操作。第三种方法:        简单的逻辑转换。  SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 1275480,20; SELECT * FROM pw_gbook WHERE uid='48' ORDER BY postdate DESC LIMIT 1275480,20;转换成:

分类:腾博会手机版下载

时间:2016-11-02 07:27:03