数据库难不难真的很难学吗真实感受?

是挺难学的,如若前期埋下的坑越多到后期数据库就会成为整个系统的瓶颈;因此,学好秘诀就是更规范化的使用,说说MySQL在开发中5大实用技巧,都是实践出来的血泪经验,记住了学习和工作都能受益匪浅。一、基础规范1. 使用InnoDB 存储引擎没有特殊要求(即Innodb无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用Innodb存储引擎(mysql5.5之前默认使用Myisam,5.6以后默认的为Innodb)Innodb 支持事务,支持行级锁,更好的恢复性,高并发下性能更好2. 所有表都需要添加注释使用comment从句添加表和列的备注 从一开始就进行数据字典的维护3. 单表数据量建议控制在500万以内500万并不是MySQL数据库的限制,过大会造成修改表结构,备份,恢复都会有很大的问题,可以用历史数据归档(应用于日志数据),分库分表(应用于业务数据)等手段来控制数据量大小4. 不在数据库中存储图、文件等大的二进制数据通常文件很大,会短时间内造成数据量快速增长,数据库进行数据库读取时,通常会进行大量的随机IO操作,文件很大时,IO操作很耗时 通常存储于文件服务器,数据库只存储文件地址信息5. 尽量做到冷热数据分离,减小表的宽度MySQL限制每个表最多存储4096列,并且每一行数据的大小不能超过65535字节 减少磁盘IO,保证热数据的内存缓存命中率(表越宽,把表装载进内存缓冲池时所占用的内存也就越大,也会消耗更多的IO) 更有效的利用缓存,避免读入无用的冷数据 经常一起使用的列放到一个表中(避免更多的关联操作)二、命名规范1、库名、表名、字段名必须使用小写字母,并采用下划线分割
MySQL有配置参数lower_case_table_names=1,即库表名以小写存储,大小写不敏感。如果是0,则库表名以实际情况存储,大小写敏感;如果是2,以实际情况存储,但以小写比较
如果大小写混合使用,可能存在abc,Abc,ABC等多个表共存,容易导致混乱
字段名显示区分大小写,但实际使用时不区分,即不可以建立两个名字一样但大小写不一样的字段
为了统一规范, 库名、表名、字段名使用小写字母,不允许 - 号2、库名、表名、字段名禁止超过32个字符,需见名知意,建议使用名词不是动词库名、表名、字段名支持最多64个字符,但为了统一规范、易于辨识以及减少传输量,禁止超过32个字符3、库名、表名、字段名禁止使用MySQL保留字当库名、表名、字段名等属性含有保留字时,SQL语句必须用反引号引用属性名称,这将使得SQL语句书写、SHELL脚本中变量的转义等变得非常复杂。4、临时库、表名必须以tmp为前缀,并以日期为后缀形如:tmp_user_account_201903135、备份库、表必须以bak为前缀,并以日期为后缀形如:bak_user_account_201903136、主键索引名为 pk_ 字段名;唯一索引名为 uk _ 字段名;普通索引名则为 idx_ 字段名pk_ 即 primary key;uk_ 即 unique key;idx_ 即 index 的简称7、在不同的库或表中,要保证所有存储相同数据的列名和列类型必须一致一般作为关联列,如果查询时关联列类型不一致会自动进行数据类型隐式转换,会造成列上的索引失效,导致查询效率降低8、表的命名最好是加上“业务名称_表的作用”正例:user_task / force_project / trade_config三、字段设计规范1、优先选择符合存储需要的最小的数据类型列的字段类型越大,建立索引占据的空间就越大,导致一个页中的索引越少,造成IO次数增加,影响性能。
1)业务中选择性很少的状态status、类型type等字段推荐使用tinytint或者smallint类型节省存储空间
2) 能用int的就不用char或者varchar
3) 能用tinyint的就不用int
4)使用 UNSIGNED 存储非负数值
5)使用tinyint来代替 enum和boolean
6)存储 ip 最好用 int存储而非 char(15)
7)表中的自增列(auto_increment属性),推荐使用bigint类2、不推荐使用blob,text等类型blob,text是为了存储极大的字符串而设计的数据类型,采用二进制与字符串方式存储,该数据类型不能设置默认值、不便于排序、不便于建立索引, varchar 的性能会比 text 高很多,如果非要使用,建议将这种数据分离到单独的拓展表中3、禁止使用字符串来存储日期型数据
无法使用日期函数计算比较
字符串存储要占更多的内存空间,datetime(8字节)和timestamp(本身是以int存储,占4字节,范围:1970-01-01 00:00:01到2038-01-19 03:14:07)
TIMESTAMP 记录经常变化的更新/创建/发布/日志时间等,并且是近来的时间,够用,可免时区处理
DATETIME 记录生日、纪念事件、超出 TIMESTAMP 的时间,记得时区处理4、用 DECIMAL 代替 FLOAT 和 DOUBLE 存储精确浮点数Decimal类型为精准浮点数,float 和 double 在存储的时候,存在精度损失的问题,很可能在值的比较时,得到不正确的结果。如果存储的数据范围超过 decimal 的范围,建议将数据拆成整数和小数分开存储。5、必须把字段定义为NOT NULL并设默认值
NULL的列使用索引,索引统计,值都更加复杂,MySQL更难优化
NULL需要更多的存储空间
NULL只能采用IS NULL或者IS NOT NULL,而在=/!=/in/not in时有大坑6、使用varchar(20)存储手机号,不要使用整数
牵扯到国家代号,可能出现+/-/()等字符,例如+86
手机号不会用来做数学运算
varchar可以模糊查询,例如like ‘138%’7、根据业务区分使用char/varchar
字段长度固定,或者长度近似的业务场景,适合使用char,能够减少碎片,查询性能高
字段长度相差较大,或者更新较少的业务场景,适合使用varchar,能够减少空间8、禁止在数据库中存储明文密码,把密码加密后存储9、尽量不使用外键建议在应用层实现外键的逻辑, 外键与级联更新不适合高并发场景,降低插入性能,大并发下容易产生死锁10、整形定义中不添加长度,比如使用INT,而不是INT[4]值类型括号后面的数字只是表示宽度而跟存储范围没有关系11、核心表必须有行数据的创建时间和最后更新时间核心表(如用户表,金钱相关的表)必须有行数据的创建时间字段create_time和最后更新时间字段update_time,便于查问题12、INT 类型不使用 unsigned 无符号属性,容易引入额外的计算问题。13、敏感字段需加密,如账户密码、信用卡号等存储使用:动态盐 + 非固定加密算法(MD5/AES256等) + 多轮加密,不要简单使用 MD5 算法加密,容易被暴力破解。四、索引设计规范索引其实就是一种数据结构,(哈希表、树等等)不同类型的索引有着不同的数据结构和功能。MySQL的查询速度依赖良好的索引设计,因此索引对于高性能至关重要。合理的索引会加快查询速度,不合理的索引会降低速度0、索引的作用
加速查询速度
维护数据的约束性(完整性、一致性)
对于加速查询,使用索引不一定是最好的选择。小表就直接全表扫描,中到大表就建索引,超大表就分区分表。其实主要就要索引带来的好处和维护索引的成本之间的权衡。1、单表的索引数建议不超过 5 个,单个索引中的字段数建议不超过 5 个太多就起不到过滤作用了,索引也占空间,管理起来也耗资源2、对字符串使用前缀索引,前缀索引长度不超过8个字符
不要索引blob/text等字段,不要索引大型字段,这样做会让索引占用太多的存储空间
前缀索引就是对文本的前几个字符建立索引,前缀索引能有效减小索引文件的大小,提高索引的速度。但是前缀索引也有它的坏处:MySQL 不能在 ORDER BY 或 GROUP BY 中使用前缀索引,也不能把它们用作覆盖索引(Covering Index)3、主键准则
表必须有主键
不使用更新频繁的列
尽量不选择字符串列
不使用UUID MD5 HASH
默认使用非空的唯一键
建议选择自增或发号器4、重要的SQL必须被索引,核心SQL优先考虑覆盖索索引
UPDATE、DELETE 语句的 WHERE 条件列
ORDER BY、GROUP BY、DISTINCT 的字段
多表 JOIN 的字段
覆盖索引可以避免Innodb表进行索引的二次查询,把随机IO变成顺序IO,加快查询效率5、区分度最大的字段放在前面
选择筛选性更优的字段放在最前面,比如单号、userid等,type,status等筛选性一般不建议放在最前面
索引根据左前缀原则,当建立一个联合索引(a,b,c),则查询条件里面只有包含(a)或(a,b)或(a,b,c)的时候才能走索引,(a,c)作为条件的时候只能使用到a列索引,所以这个时候要确定a的返回列一定不能太多,不然语句设计就不合理,(b,c)则不能走索引6、业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引不要以为唯一索引影响了 insert 速度,这个速度损耗可以忽略,但提高查找速度是明显的;另外,即使在应用层做了非常完善的校验控制,只要没有唯一索引,根据墨菲定律,必然有脏数据产生7、InnoDB 和 MyISAM 存储引擎表,索引类型必须为BTREE
MEMORY表可以根据需要选择 HASH 或者 BTREE 类型索引00、MYSQL 中索引的限制
MYISAM 存储引擎索引长度的总和不能超过 1000 字节
BLOB 和 TEXT 类型的列只能创建前缀索引
使用不等于 (!= 或者 <>) 的时候, MYSQL 无法使用索引
过滤字段使用函数运算 (如 abs (column)) 后, MYSQL无法使用索引
join语句中join条件字段类型不一致的时候MYSQL无法使用索引
使用 LIKE 操作的时候如果条件以通配符开始 (如 ‘%abc…’)时, MYSQL无法使用索引。
使用非等值查询的时候, MYSQL 无法使用 Hash 索引8、不要因为数据量大,使用分区表,MySQL 是索引组织表,数据量再大,定位记录也只需要3、4 次 I/O。可以考虑分区表唯一的应用场景是:需要定期清理历史流水类数据,但如果业务可以按月、按天做分表,那么当前 MySQL 8.0 版本,分区表也不推荐使用。9、业务上线或新版本发布前,DBA 一定要进行所有 SQL Review,确保 SQL 走索引,否则不予上线,或由业务以邮件等正式方式,通知 DBA 该 SQL 不会引起线上事故,业务方承担后续责任。10、DBA 每天要对数据库进行巡检,及早发现慢查询或潜在数据库风险,将任何潜在问题尽早抛出,否则后续自己承担相关责任。五、SQL查询规范1、按需索取,拒绝 select *
无法索引覆盖,回表操作,增加 io
额外的内存负担,大量冷数据灌入innodb_buffer_pool_size,降低查询命中率
额外的网络传输开销2、能确定返回结果只有一条时,使用 limit 1在保证数据不会有误的前提下,能确定结果集数量时,多使用limit,尽快的返回结果。3、涉及到复杂sql时,务必先参考已有索引设计,先explain
简单SQL拆分,不以代码处理复杂为由
比如 OR 条件:f_phone=’10000’ or f_mobile=’10000’,两个字段各自有索引,但只能用到其中一个。可以拆分成2个sql,或者union all
先explain的好处是可以为了利用索引,增加更多查询限制条件4、对应同一列进行 or 判断时,使用 in 代替 orin 的值不要超过 500 个, in 操作可以更有效的利用索引,or 大多数情况下很少能利用到索引5、禁止使用 order by rand() 进行随机排序
会把表中所有符合条件的数据装载到内存中,然后在内存中对所有数据根据随机生成的值进行排序,并且可能会对每一行都生成一个随机值,如果满足条件的数据集非常大,就会消耗大量的 CPU 和 IO 及内存资源
推荐在程序中获取一个随机值,然后从数据库中获取数据的方式6、WHERE从句中禁止对列进行函数转换和计算对列进行函数转换或计算时会导致无法使用索引7、不要使用 count(列名)或 count(常量)来替代 count(*)count(*)是 SQL92 定义的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关count(*)会统计值为 NULL 的行,而 count(列名)不会统计此列为 NULL 值的行8、不得使用外键与级联,一切外键概念必须在应用层解决以学生和成绩的关系为例,学生表中的 student_id是主键,那么成绩表中的 student_id则为外键。如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新, 即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。9、in 操作能避免则避免若实在避免不了,需要仔细评估 in 后边的集合元素数量,控制在 1000 个之内10、超过三个表禁止 join需要 join 的字段,数据类型必须绝对一致;多表关联查询时,保证被关联的字段需要有索引;即使双表 join 也要注意表索引、 SQL 性能11、SELECT语句不要使用UNION,推荐使用UNION ALLUNION子句个数限制在5个以内。因为union all不需要去重,节省数据库资源,提高性能12、建议使用合理的分页方式以提高分页效率MySQL分页查询的性能优化 — 详细说明13、减少与数据库交互次数,尽量采用批量SQL语句六、 MySQL教程和书看过很多,对于这套发现很多亮点,对数据一知半解的朋友还有小白来说是值得学的教程:亮点1. 内容全面层层递进:
MySQL方面知识最为全面,视频知识涵盖了MySQL的基础篇、进阶篇、运维篇这三个篇章,干货满满。在基础篇中,主要讲解MySQL的基础知识,包含MySQL安装、SQL、约束、函数、多表查询、事务等。在进阶篇中,主要讲解MySQL的存储引擎、索引、优化、存储对象、InnoDB核心、锁等相关知识。在运维篇,主要讲解了MySQL的日志、主从复制、读写分离、分库分表等方面的知识。这套课程能够完全满足我们日常的开发、运维、面试、以及自我提升的各种需求。可以快速的帮助我们构建起完整的MySQL知识脉络,所以这套视频必须收藏起来,相信将来会对你有很大帮助。
亮点2. 知识讲解深入: 特别是在进阶篇、运维篇,讲到了MySQL的索引、优化、存储引擎及其底层结构、MVCC多版本并发控制原理等方面的知识,而在讲解的时候不仅这些知识具体是什么,怎么应用,还会讲解其底层的结构和原理,我们只有明白了底层的结构和原理之后,才能够更好的应用知识,才能够举一反三。而如果大家有了一定的MySQL基础,建议大家还是认真学习一下进阶篇、运维篇的知识,这部分的知识掌握、理解了,你的MySQL的技术水平将会到达一次新的层次,助力你早日成为MySQL大牛。3. 原理通俗易懂:
涵盖了很多底层的原理,而部分原理还是比较晦涩难懂的,这个课程中加入了大量动画及图例,学下来感觉理解的好一些。其他java类的专题课,有些很实用拿出来给你们练起来shell编程:java高级程序员必备技能Shell编程_哔哩哔哩_bilibiliTreeMap:java教程进阶-TreeMap数据结构及源码解析_哔哩哔哩_bilibili强转溢出&浮点数运算:匠心之作java基础强化之强转溢出&浮点数运算精讲_哔哩哔哩_bilibili线程池:2020年JavaSE基础强化,全面深入学习线程池_哔哩哔哩_bilibili日志框架:java日志框架教程,全面深入学习多种java日志框架_哔哩哔哩_bilibili泛型:JavaSE强化教程泛型,由点到面的讲解了整个泛型体系。_哔哩哔哩_bilibili类加载器:系统学习让你轻松定义java类加载器_哔哩哔哩_bilibili编码与解码:java基础教程-详讲编码与解码,灵活解决乱码难题_哔哩哔哩_bilibiliStringTable:2020年java基础强化教程之深入java学习StringTable_哔哩哔哩_bilibiliThreadlocal:Java基础教程由浅入深全面解析threadlocal_哔哩哔哩_bilibiliLinkedList数据链表:Java基础教程-详细分析LinkedList数据链表的实现原理_哔哩哔哩_bilibiliArrayList:java进阶教程丨全面深入解析ArrayList原理(源码分析+面试讲解)_哔哩哔哩_bilibiliSynchronized:Java面试热点问题,synchronized原理剖析与优化_哔哩哔哩_bilibili并发编程volatile:Java面试热门内容精讲之——并发编程volatile_哔哩哔哩_bilibiliHashMap合集:深入解读阿里等一线大厂java面试必考HashMap技术点_哔哩哔哩_bilibili如果觉得比较比较全可以收藏看,说不定啥时候就失效了链接
方向错了,你要是沿着数据库原理-》数据库研发-》自己写一个数据库这样的路径去学习,不要说你,我相信天下99.9%的人都会觉得学不下去,太难了。那还有没有别的路径呢,还真有SQL入门 -》如果有兴趣再学 -》数据库维护 -》如有兴趣再学 =》数据库优化 -》如有兴趣再学=》数据库原理。如果真的想学明白还是推荐循序渐进的方法本人小白,从了解sql这门技术到基本学会花了1周时间 下面把一些经历分享一下希望对大家有帮助!如果喜欢直接动手学的朋友我推荐下面这个网站xuesql.cn (包含手册,在线练习,视频,文字课都在里面了)目前还比较不知名哈哈 我也是挖了很久下面是我的学习过程,第一幕:了解数据库有人听说 `数据库` 可能瞬间会有一种高大上的感觉,我刚开始也是这个感觉,但很快就被现实世界整蒙了, 这 `数据库` 太TM多了这么多我也学不完啊,幸好以前也在互联网公司呆过,选了一个听说过的 `mysql` 数据库开始学习,其他的先不管了。第二幕:学习mysql然后到我最爱的学习网站 b站去刷相关的视频,打算照着做一遍,[](- 搜索结果 - 哔哩哔哩弹幕视频网 - ( ゜- ゜)つロ 乾杯~ - bilibili)找了几个类似 1天学会mysql 之类的视频,刷来刷去,好像都要求在电脑上装mysql,于是我也照着在我的电脑上去折腾了一阵,软件算是安装完了,但我也彻底找不到装哪去了!第三幕: 可以先学sql加了一个学习的社群,终于经高手指点才搞清sql和数据的关系,高手说先不要学数据怎么安装了,一般公司里都有数据库,你只要学sql能查数据就可以<?php
终于搞清楚了,可以先学sql,再学数据库@第四幕:我买了一本书《sql必知必会》,都说很简单所以就直接转向学sql了,先是看了一本书,看起来是很简单哦总结起来说,sql就是对数据库的数据进行 增加 删除 修改 查询 对小白来说,最主要的是查询。 第五幕:我这个人有个习惯,看了书还要上Bilibili上找找视频B站去搜索了一番sql相关的视频,还真有关于sql入门的[](- 搜索结果 - 哔哩哔哩弹幕视频网 - ( ゜- ゜)つロ 乾杯~ - bilibili)看完感觉神清气爽了,就像学武功的小孩,跃跃欲试。第6幕:还不敢去操作公司的数据,所以找了几个在线练习的网站试试身手拉[](自学SQL)这个网站特点是比较清晰简单,中文的,马上可以练习,主要训练查询能力

我要回帖

更多关于 感受 的文章

 

随机推荐