没有合适的资源?快使用搜索试试~ 我知道了~
mysql 学习笔记
资源推荐
资源详情
资源评论
128
. 索引
、存储结构 :每个 在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩
展名指出文件类型 文件存储表定义数据文件的扩展名为索引文件的扩展名是
。 :所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间
文件), 表的大小只受限于操作系统文件的大小,一般为 。
、存储空间 :可被压缩,存储空间较小。支持三种不同的存储格式:静态表默认,但是注意
数据末尾不能有空格,会被去掉、动态表、压缩表。
:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。
、可移植性、备份及恢复 :数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。
在备份和恢复时可单独针对某个表进行操作。:免费的方案可以是拷贝数据文件、备份
(二进制日志记录对数据发生或潜在发生更改的 ! 语句),或者用 "#$%,在数据量达到几十
的时候就相对痛苦了。
&、事务支持 :强调的是性能,每次查询具有原子性其执行数度比 类型更快,但是不提
供事务支持。:提供事务支持事务,外部键等高级数据库功能。 具有事务 '、回滚
'( 和 崩 溃 修 复 能 力 '")*'+*'%" 的 事 务 安 全 "',"*-
'%型表。
.、/0123-45530*:可以和其他字段一起建立组合索引。引擎的自动增长列必须是索引,
如果是组合索引自动增长可以不是第一列他可以根据前面几列进行排序后递增。
: 中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必
须是组合索引的第一列。
6、表锁差异 :只支持表级锁,用户在操作 " 表时,"',$%,,"
语句都会给表自动加锁,如果加锁以后的表满足 " 并发的情况下,可以在表的尾部插入新的数据。
:支持事务和行级锁,是 的最大特色。行锁大幅度提高了多用户并发操作的新能。但是
的行锁,只是在 78545 的主键是有效的,非主键的 78545 都会锁全表的。
9、全文索引 即文本形式索引 :支持 :/!!05;0 类型的全文索引 :不支持 :/!!05;0
类型的全文索引,但是 可以使用 "%) 插件支持全文索引,并且效果更好。
<、表主键 :允许没有任何索引和主键的表存在,索引都是保存行的地址。
:如果没有设定主键或者非空唯一索引,就会 自动生成一个 6 字节的主键用户不可见,数据是
主索引的一部分,附加索引保存的是主索引的值。
=、表的具体行数 :保存有表的总行数,如果 "'*'$>**会直接取出出该值。
:没有保存表的总行数,如果使用 "'*'$>**;就会遍历整个表,消耗相当大,
但是在加了 ?) 条件后," 和 处理的方式都一样。
@、-/4 操作 :如果执行大量的 5!5-0, 是更好的选择。"*把索引加载到
了内存中,查询语句搜索时候,从 内存中把索引找出来,然后去 *查找数据
:如果你的数据执行大量的 3540 或 /A05,出于性能方面的考虑,应该使用 表。
5!505*从性能上 更优,但 5!505*:41* 时, 不会重新建立表,而是一行一
行的删除,在 上如果要清空保存有大量数据的表,最好使用 $'* 这个命令。
、外键 :不支持 :支持
通过上述的分析,基本上可以考虑使用 来替代 引擎了,原因是 自身很多良好
的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信 的表现
肯定要比 强很多。另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表
类型,才能最大的发挥 ! 的性能优势。如果不是很复杂的 7 应用,非关键应用,还是可以继续
考虑 *
和 是许多人在使用 ! 时最常用的两个表类型,这两个表类型各有优劣,视具体
128
228
应用而定。基本的差别为: 类型不支持事务处理等高级处理,而 类型支持。
类型的表强调的是性能,其执行数度比 类型更快,但是不提供事务支持,而 提供事务支
持以及外部键等高级数据库功能。
作为使用 ! 的用户角度出发, 和 都是比较喜欢的,如果数据库平台要达
到需求:===B的稳定性,方便的扩展性和高可用性来说的话, 绝对是首选。原因如下:
*平台上承载的大部分项目是读多写少的项目,而 的读性能是比 强不少的。
* 的索引和数据是分开的并且索引是有压缩的内存使用率就对应提高了不少能加载更多索引,
而 是索引和数据是紧密捆绑的没有使用压缩从而会造成 比 体积庞大不小。
经常隔 个月就会发生应用开发人员不小心 $% 一个表 ?) 写的范围不对,导致这个表没法
正常用了,这个时候 的优越性就体现出来了,随便从当天拷贝的压缩包取出对应表的文件,随
便 放到 一个数据 库目 录 下 , 然 后 $% 成 "# 再导 回到主库 ,并 把 对 应 的 补 上 。 如果 是
,恐怕不可能有这么快速度别和我说让 定期用导出 "# 机制备份最小数据库实例数
据量基本都是几十 *
&、从接触的应用逻辑来说"'*'$>*和 **是最频繁的,大概能占了整个 "# 总语句的
6@B以上的操作而这种操作 其实也是会锁表的
、还有就是经常有很多应用部门需要我给他们定期某些表的数据 的话很方便,只要发给他们对
应那表的 的文件,让他们自己在对应版本的数据库启动就行,而 就需要导出
了,因为光给别人文件,受字典数据文件的影响,对方是无法使用的。
、如果和 比 写操作的话, 还达不到 的写性能,如果是针对基于索引的
操作,虽然 可能会逊色 但是那么高并发的写,从库能否追的上也是一个问题,还
不如通过多实例分库分表架构来解决。
、如果是用 的话,! 引擎可以大大加快应用部门的开发速度,他们只要对这个 ! 表做一
些 ""#$%操作,非常适合大项目总量约几亿的 & 某一类型#如日志,调查统计%的业务表。
当然 也不是绝对不用,用事务的项目就用 的。
'选择合适的数据类型
一"( 和 )"("( 是固定长度的,查询速度比 )"( 速度快的多。"( 的缺点是浪费存储空间。
检索 "( 列时,返回的结果会删除尾部空格,所以程序需要对为空格进行处理。
对于长度变化不大且对查询速度有较高要求的数据可以考虑使用 "(。
存储引擎使用原则::建议使用固定长度列代替可变长度列。*:建议使用 )"( 类型
二 和 在保存大文本时,通常选择 或者 。二者的差别是 可以保存二进制数据,比如
照片。 和 又包括 、、! 和 、、!,他们之间的区别是
存储文本长度不同和存储字节不同。应根据情况选择满足需求的最小存储类型。
和 执行大量删除操作时,产生数据“空洞”可以发现数据文件并没有因为数据行记录删除而减少。
对表进行 +,#优化%操作:可以发现表数据文件大大缩小,“空洞”空间已经被回收。
'用合成#(+"%索引提高查询性能根据大文本字段#、%的内容建立一个散列值,并把这个值存储
在单独的数据列中,然后通过散列值找数据行。缺点:只能进行精确查询#-、./范围操作符是没有用处的%
可以通过 01 自带函数 #%、(#%、""2'#%生成散列值,也可以通过编程语言计算散列值。
合成索引只能用于精确匹配,在一定程度上减少了 3,从而提高了查询效率。
2在不必要的时候避免检索大型的 或 值。 4把 或 列分离到单独的表中。
三、浮点数和定点数 浮点数存在误差问题。'对货币等对精度敏感的数据,应该用定点数表示或存储。
定点数是以字符串形式存储数据,不会有精度丢失 2在编程中,如果用到浮点数,要特别注意误差问题,
并尽量避免做浮点数比较。
2字符集 系统变量:•
"("55):默认的内部操作字符集 "("55":客户端来源数据使用的字符集
228
328
"("55""+:连接层字符集 "("55:查询结果字符集
"("55:当前选中数据库的默认字符集 "("55:系统元数据#字段名等%字符
集
字符集合校对规则有 4 个级别的默认设置:
)服务器级别;')数据库级别;2)表级别、列级别;4)连接级别。 01 中的字符集转换过程
01) 收到请求时将请求数据从 "("55" 转换为 "("55""+;
'进行内部操作前将请求数据从 "("55""+ 转换为内部操作字符集,其确定方法如下:
6使用每个数据字段的 7897:;9;: 设定值;
6若上述值不存在,则使用对应数据表的 ;<=1:7897:;9;: 设定值#01 扩展,非 01 标准%;
6若上述值不存在,则使用对应数据库的 ;<=1:7897:;9;: 设定值;
若上述值不存在,则使用 "("55) 设定值。
2将操作结果从内部操作字符集转换为 "("55
我们现在回过头来分析下我们产生的乱码问题:
我们的字段没有设置字符集,因此使用表的数据集 我们表没有指定字符集默认使用数据库存的字符集
"我们的数据库在创建的时候没有指定字符集,因此使用 "("55) 设定值
我们没有特意去修改 "("55) 的指定字符集,因此使用 默认
默认的字符集是 +,因此,我们使用了 + 字符集,而我们 "("55""+ 的字符
集是 =:<6>,插入中文乱码也再所难免了。
常见问题解析:乱码问题 插入后在表中就是乱码,查询出来表的结果用默认表字段的字符集
<06向默认字符集为 ?> 的数据表插 ?> 编码的数据前没有设置连接字符集查询时设置连接字符集 ?>
插入时根据 01 服务器的默认设置"("55""("55""+ 和 "("55
均为 +;
@插入操作的数据将经过 +/.+/.?> 的字符集转换过程,这一过程中每个插入的汉字都会从原始的
2 个字节变成 个字节保存;
@查询时的结果将经过 ?>/.?> 的字符集转换过程,将保存的 个字节原封不动返回,产生乱码。
数据丢失问题•向默认字符集为 + 的数据表插入 ?> 编码的数据前设置了连接字符集为 ?>
插入时根据连接字符集设置 "("55"、"("55""+ 和 "("55 均为
?>;
66插入数据将经过 ?>/.?>/.+ 的字符集转换,若原始数据中含有ABBBBCABBD 范围以外的 ="
字符,会因为无法在 + 字符集中表示而被转换为“EF#BG2<%符号,以后查询时不管连接字符集设置如何
都无法恢复其内容了。
01 字符集建议HI建立数据库表和进行数据库操作时尽量显式指出使用的字符集,而不是依赖于
01 的默认设置,否则 01 升级时可能带来很大困扰;
I数据库和连接字符集都使用 + 时,虽然大部分情况下都可以解决乱码问题,但缺点是无法以字符为
单位来进行 01 操作,一般情况下将数据库和连接字符集都置为 ?> 是较好的选择;
I使用 7J( 提供 7 语言操作的 J)时,初始化数据库句柄后马上用 5+ 设定
015;:5789;:5K; 属性为 ?>,这样就不用显式地用 ;:K; 语句指定连接字符集,且用
5! 重连断开的长连接时也会把连接字符集重置为 ?>;
I对于 J8JJ,一般页面级的 J8J 程序总运行时间较短,在连接到数据库以后显式用 ;:K; 语
句设置一次连接字符集即可;但当使用长连接时,请注意保持连接通畅并在断开重连后用 ;:K; 语句
显式重置连接字符集。
根据上面的分析和建议,我们解决我们遇到问题应该使用什么方法大家心里应该比较清楚了。 就是在创建
的时候指定字符集,不要去通过修改默认配置来达到目的,当然你也可以采用指定表的字符集的
形式,但很容易出现遗漏,特别是在很多人都参与设计的时候,更容易纰漏。
328
428
乱码终极解决方案 )首先要明确你的客户端时候何种编码格式,这是最重要的(; 一般用 ?>,命令行
一般是 !L,一般程序是 !'2'%
')确保你的数据库使用 ?> 格式,很简单,所有编码通吃。
2)一定要保证 ""+ 字符集大于等于 " 字符集,不然就会信息丢失,比如: +-!'2'-!L
-?>,若设置 "("55"/!'2',那么至少 ""+ 的字符集要大于等于 !'2',否则
就会丢失信息
4)以上三步做正确的话,那么所有中文都被正确地转换成 ?> 格式存储进了数据库,为了适应不同的浏
览器,不同的客户端,你可以修改 "("55 来以不同的编码显示中文字体,由于 ?> 是大方
向,因此 & 应用是我还是倾向于使用 ?> 格式显示中文的。
=:<6> 最大的一个特点,就是它是一种变长的编码方式。它可以使用 C4 个字节表示一个符号,根据不同
的符号而变化字节长度。 =:<6> 的编码规则很简单,只有二条:)对于单字节的符号,字节的第一位设
为 B,后面 位为这个符号的 " 码。因此对于英语字母,=:<6> 编码和 7 码是相同的。
')对于 字节的符号(.),第一个字节的前 位都设为 ,第 M 位设为 B,后面字节的前两位一律
设为 B。剩下的没有提及的二进制位,全部为这个符号的 " 码。
下表总结了编码规则,字母 表示可用编码的位。 =" 符号范围 N=:<6> 编码方式
#十六进制%N(二进制)
BBBBBBBB6BBBBBB <NBBBBBBB>B6BBBBB <<NBB
BBBB B>BB6BBBB <<<< N B B B BBB BBBB6BBB <<<< N B B B
B
跟据上表,解读 =:<6> 编码非常简单。如果一个字节的第一位是 B,则这个字节单独就是一个字符;如果
第一位是 ,则连续有多少个 ,就表示当前字符占用多少个字节。
下面,还是以汉字O严O为例,演示如何实现 =:<6> 编码。
已知O严O的 " 是 4;'(BBBBBBBB),根据上表,可以发现 4;' 处在第三行的范围内(BBBB
B>BB6BBBB<<<<),因此O严O的 =:<6> 编码需要三个字节,即格式是OBBBO。
B其他需注意的问题 大小写敏感 01 在 1 下数据库名、表名、列名、别名大小写规则是这样的:
数据库名与表名是严格区分大小写的;' 表的别名是严格区分大小写的;
2 列名与列的别名在所有的情况下均是忽略大小写的 ;4 字段内容默认情况下是大小写不敏感的。变量名
也是严格区分大小写的 查询时 &( 条件是否区分大小写 例如我们使用 =:<> 编码," 使用 ?>5
时区分大小写," 使用 ?>5!5" 时不区分大小写 中控制数据库名和表名的大小写敏感由
参数 &5"55 控制为 B 时表示区分大小写为 时表示将名字转化为小写后存储不区分大小
写。
如果一个实体的某个字段指向另一个实体的主键,就称为外键;用于约束处于关系内的实体
增加子表记录时是否有与之对应的父表记录;如果主表没有相关的记录从表不能插入;先插入主表数据
后再插入从表数据:在删除或者更新主表记录时,从表应该如何处理相关的记录 设置级联操作:在主表
数据发生改变时,与之关联的从表数据应该如何处理 使用关键字: 来标识
允许的级联动作:"" 关联操作,如果主表被更新或删除,从表也会执行相应的操作 表示从表
数据不指向主表任何记录 ":拒绝主表的相关操作
5!L#"5%"5"#"5%
PQ在删除外键时,将从表的外键值设置为 注:与 可以同时出现,
但在 或 后不能同时出现 ""、、",只能有一个;":拒绝主表的
相关操作,在主表更新或者删除数据时,在从表中存在与主表主键相关的数据,则不允许对主表数据进行
更新或者删除;在 " 约束下,如果想要删除主表数据,除了可以删除没有与子表数据相关的数据外 ,
可以先修改子表中的外键;也可以先删除与想要删除的主表数据的子表数据,再去删除此条主表数据。
R常用 01 技巧 "$59K#%
428
528
使用 S93=J*的 T:89311=J字句可以检索出更多的分组聚合信息,它不仅仅能像一般的 S93=J*语
句那样检索出各组的聚合信息,还能检索出本组类的整体聚合信息。
")!#%!&(P最后多一行数据记录是公共的 )!#%
NN)!#%NNBNBNBBBBBBNNB'NB'N'4BBBBBN NK=11NK=11N'BRBBBBBN所有的平
均值 使用有 T:89311=J子句的 S93=J*语句时不能再使用 39;9*语句对结果集进行排序
>01 及相关问题
5简而言之就是:它定义了你 01 应该支持的 语法,对数据的校验等等
、K 模式:宽松模式,更改语法和行为,使其更符合标准 01。对插入数据进行校验,如果不符合定
义类型或长度,对数据类型调整或截断保存,报 &! 警告。对于本文开头中提到的错误,可以先把
5 设置为 K 模式,这样便可以插入数据,而对于除数为 B 的结果的字段值,数据库将会用 K=11
值代替。
'、:9:3K1 模式:严格模式,当向 数据库插入数据时,进行数据的严格校验,保证错误数据不
能插入,报 错误,而不仅仅是警告。用于事务时,会进行事务的回滚。 注释:一旦发现错误立即放
弃 K;9:=J:;。如果你使用非事务存储引擎,这种方式不是你想要的,因为出现错误前进行的数据更
改不会“滚动”,结果是更新“只进行了一部分”。
2、:97:5:9K5:*1; 模式:严格模式,进行数据的严格校验,错误数据不能插入,报 错误。如
果不能将给定的值插入到事务表中,则放弃该语句。对于非事务表,如果值出现在单行语句或多行语句的
第 行,则放弃该语句。将当前数据库模式设置为 :97:5:9K5:*1; 模式
01还可以实现对数据效验和转移等功能如H效验日期数据合法性' 在 K;9:或 =J:;过程中,
如果被零除#或 3#U,B%%,则产生错误 2 将‘OV视为识别符引号#WXV引号字符%4 禁用反斜线字符#WAV%做为字
符串内的退出字符。启用 K35*7Y185;7J; 模式,反斜线则成为普通字符。 将NN视为字符串连接
操作符(+)#同 73K7:#%%,而不视为 39。
锁机制和事务控制 事务H事务的机制通常被概括为“7F原则即原子性()、一致性(7)、隔离性
()和持久性() 数据库事务会导致脏读、不可重复读和幻影读等问题。
脏读:事务还没提交,他的修改已经被其他事务看到。
不可重复读:同一事务中两个相同 01 读取的内容可能不同。两次读取之间其他事务提交了修改可能会造
成读取数据不一致。
幻影数据:同一个事务突然发现他以前没发现的数据。和不可重复读很类似,不过修改数据改成增加数据。
针对可能的问题,* 提供了四种不同级别的机制保证数据隔离性。
事务的隔离是通过锁机制实现的,不同于 使用表级别的锁,* 采用更细粒度的行级别锁,提
高了数据表的性能。
更新丢失(1=):当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个
事务都不知道其他事务的存在,就会发生丢失更新问题--最后的更新覆盖了由其他事务所做的更新。
* 的锁通过锁定索引来实现,如果查询条件中有主键则锁定主键,如果有索引则先锁定对应索引然
后再锁定对应的主键(可能造成死锁),如果连索引都没有则会锁定整个数据表。
29;=K73::9;=K73: 允许某个事务看到其他事务并没有提交的数据。可能会导致脏读 、
不可重复读、幻影数据。 原理:9;=K73: 不会采用任何锁。
2'9;73::9;73: 允许某个事务看到其他事务已经提交的数据。可能会导致不可重复读和
幻影数据。 原理:数据的读是不加锁的,但是数据的写入、修改、删除加锁,避免了脏读。
229;J;:*1;9;:* 中 9;J;:*1;9; 级别同一个事务的两次相同读取肯定是一样的,其他事
务的提交不会对本次事务有影响。 原理:数据的读、写都会加锁,当前事务如果占据了锁,其他事务必
须等待本次事务提交完成释放锁后才能对相同的数据行进行操作。
24;91Z*1;#串行%:;91Z*1;级别在 * 中和 9;J;:*1;9; 采用相同的实现。
528
剩余27页未读,继续阅读
资源评论
hhuanlihong
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功