390 likes | 473 Views
数据库及求职通涉及知识交流. 什么是数据库?. 是以一定的组织方式将相关数据组织在一起,长期存放在计算机内可为多个用户共享,与应用程序彼此独立,统一管理的数据集合。. 什么是数据库管理系统?. 是位于用户和操作系统之间,具有操作系统之间,具有数据定义、管理和操纵功能的软件集合。. 什么是数据库系统. 是实现有组织、动态的存储大量相关的结构化数据,方便各类用户访问数据库的计算机软件 / 硬件资源。. 数据库的类型. 关系型数据库 Oracle 、 MySQL 、 SQLServer 非关系型数据库
E N D
什么是数据库? • 是以一定的组织方式将相关数据组织在一起,长期存放在计算机内可为多个用户共享,与应用程序彼此独立,统一管理的数据集合。
什么是数据库管理系统? • 是位于用户和操作系统之间,具有操作系统之间,具有数据定义、管理和操纵功能的软件集合。
什么是数据库系统 • 是实现有组织、动态的存储大量相关的结构化数据,方便各类用户访问数据库的计算机软件/硬件资源。
数据库的类型 • 关系型数据库 Oracle、MySQL、SQLServer • 非关系型数据库 NoSQL(NoSQL = Not Only SQL ) Google的 BigTable和Amazon 的Dynamo Apache 的HBase
为什么会有NoSQL • 对数据库高并发读写的需求 • 对海量数据的高效率存储和访问的需求 • 对数据库的高可扩展性和高可用性的需求 • 数据库事务一致性需求 • 数据库的写实时性和读实时性需求 • 对复杂的SQL查询,特别是多表关联查询的需求
NoSQL与关系型数据库设计理念比较 关系型数据库中的表都是存储一些格式化的数据结构,每个元组字段的组成都一样,即使不是每个元组都需要所有的字段,但数据库会为每个元组分配所有的字段,这样的结构可以便于表与表之间进行连接等操作,但从另一个角度来说它也是关系型数据库性能瓶颈的一个因素。而非关系型数据库以键值对存储,它的结构不固定,每一个元组可以有不一样的字段,每个元组可以根据需要增加一些自己的键值对,这样就不会局限于固定的结构,可以减少一些时间和空间的开销。
数据库的设计规范与步骤 • 范式 • 步骤 需求分析 概念结构设计 逻辑结构设计 物理结构设计
MySQL的存储引擎 • MyISAM • InnoDb
MySIAM • MySQL默认存储引擎,在性能和可用特征之间做到良好的平衡 • 加锁与并发-表级锁 • 索引特性:可以给予BLOB或text的前500个字符,串讲相关索引,支持全文索引 • 不支持事务
InnoDB • 专为事务处理设计的一款存储引擎 • InnoDB不能根据排序建立索引,而MyISAM可以,当InnoDB加载数据和创建索引时会比MySIAM慢很多 • 外键约束
优化与索引 • 更小通常更好 越小占用cup周期越少,注意范围 • 简单就好 越简单占用cup周期越少,eg:比较整数比比较字符串快,用mysql内建的数据类型保存日期和时间,不用字符串,使用整数保存IP • 尽量避免null 除非真的需要NULL,否则把列定义为非空
为什么避免NULL MySQL难以优化使用了可空列的查询,它会使索引、索引统计和值更加复杂。可空列需要更多的存储空间,还需要在MySQL内部进行特殊处理。当可空列被索引的时候,每条记录都需要一个额外的字节,还可能导致MyISAM中固定大小的索引(例如一个整数列上的索引)变成可变大小的索引。 即使要在表中存储“没有值”的字段,还是有可能不用NULL的,考虑使用0、特殊值或空字符串来代替他 但是:把NULL列改为NOT NULL带来的性能很小。可以不优先处理
决定列的数据类型的步骤 • 大致决定数据的类型:如:数字、字符串、时间 • 确定特定的类型 eg:DATATIME和TIMESTAMP能保存同样类型的数据:日期和时间,精度为秒,然而,TIMESTAMP使用的空间只有DATETIME的一半,还能保存时区,拥有特殊的自动更新能力,另一方面,它允许的范围要小得多,并且在某些时候,他的特殊功能会成为障碍。
整数 • TINYINT 8 • SMALLINT 16 • MEDIUMINT 24 • INT 32 • BUGINT 64 • 可以无符号 • 注意:MySQL可以对整型定义宽度,比如int(11),但是这对于大多数应用程序是没有意义的,它不会限制值的范围,只规定了MySQL交互工具用来显示字符的个数。对于存储和计算int(1)和int(20)是一样的。
字符串类型-VARCHAR • VARCHAR 保存了可变长度的字符串,占用更少存储空间,VARCHAR 使用额外的1到两个字节来存储值的长度,如果列的最大长度小于或等于255,则使用1字节,否则就使用2字节 不同的存储引擎可能会使用不同的方式把CHAR和VARCHAR类型保存到内存中,并且服务器从存储引擎取回这些值的时候还可能会把它转换为其他存储格式。
VARCHAR的优缺点 • VARCHAR能节约空间,对性能有帮助,但是在更新的时候可能会发生变化,会引起额外的工作 • 当最大长度远大于平均长度,并且很少发生更新的时候,通常适合使用VARCHAR
CHAR • CHAR在存储很短的字符串或长度近似相同的字符串的时候很有用,eg:存纯用户的MD5哈希值,他的长度是一样的。对于经常改变的值,CHAR也好于VARCHAT,因为固定长度的行不容易产生碎片。
日期和时间 • DATETIME 能保存从1001年到9999年,精度为秒,它使用了8字节存储空间 • TIMESTAMP 保持了1970年午夜(格林威治时间)以来的秒数,只是用了4字节的存储空间,范围比DATATIME小的多,只能表示从1970年到2038年,显示的值依赖于时区。添加和更新的时候如果没有指定自动添加和更新为当前时间
索引 • 索引在数据越大的时候越重要 • 如果索引包含了来自表中的某一列或多个列的值,那么列的顺序非常重要,因为MySQL只能高效的搜索索引的最左前缀。
索引类型 B-Tree索引 哈希索引 全文索引(MyISAM特有)
正确的创建索引 • 隔离列 它不是表达式的一部分 没有位于函数中 一种较好的方式 还可以改进,使用CURRENT_DATE将会组织查询缓存把结果缓存起来,可以用常量替换掉
为排序使用索引扫描 • 按照索引对结果进行排序,只有当速印的顺序和Order by字句中的顺序完全一致,并且所有列排序的方向(升序或降序)一样才可以。如果查询连接了多个表,只有在order by字句的所有列引用的是第一个表才可以。查找查询中的order by 字句也有同样的局限,它要使用索引的最左前缀。
为排序使用索引扫描 • Order by 无须定义索引的最左前缀的一种情况是前导列为常量。如果where子句和join子句为这些列定义了常量,他们就能弥补索引的缺陷。 Eg:
多余和重复索引 • MySQL不会为错误提供保护,但不得不单独维护每一个索引,优化时诸葛考虑他们,严重影响性能。 • 以同样的顺序在同样的列上创建的索引是多余和重复的索引(只适合于B-Tree索引) • 不同类型的索引不是多余的
Limit参与 如果对于有where 条件,又想走索引用limit的,必须设计一个索引,将where 放第一位,limit用到的主键放第2位,而且只能select 主键!
Phonegap环境搭建 • 搭建一个android开发环境,http://developer.android.com/sdk/index.html • 新建Android Project • 在项目的目录下,建两个文件夹: /libs /assets/www • 将cordova.js放到/assets/www目录下,将cordova-2.9.0.jar放到lib目录下,并build path到classpath中。 • 再把xml目录copy到android项目的res目录下。
4.在/assets/www下建立index.html文件,内容看起来像这样:4.在/assets/www下建立index.html文件,内容看起来像这样: • 将以下权限配置的xml内容copy到AndroidManifest.xml文件中。 • 最后再修改下src下的Java主文件: 1)添加import org.apache.cordova.DroidGap 2)将类改成继承为DroidGap; 4)把setContentView()这行替换为super.loadUrl("file:///android_asset/www/index.html"); • 运行模拟器,成功
PhoneGap Plugin • 新建一个Java类,使其继承CordovaPlugin • 重写父类的execute方法,编写自己需要的代码 • 在/res/xml/plugins.xml文件中添加以下内容: <feature name="Call"> <param name="android-package" value="com.nenu.qzt.plugin.Call"/> </feature> • 在html页面中调用 • eg:window.test = function(str) { cordova.exec(function(aaa){}, function(err){alert(err);}, "Call", "test", [str]); };
JSONP Jsonp(JSON with Padding)是资料格式 json的一种“使用模式”,可以让网页从别的网域获取资料。 由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。
示例 $.ajax({ type:'get', url:'http://www.dsjyw.net/android/jyzyweixin/page/employInfo/employInfoDetail.php',//从该处获取数据 dataType:'jsonp', data:'comId=' + comId +'&requirement_id=' +requirement_id, success:function(data){ } }) 服务器端返回的数据格式如下: callback([{"id":"1","name":"测试1"},{"id":"2","name":"测试2"}])