面试提高及日常学习积累(二)——数据库篇

这一篇主要讲mysql的一些积累和学习体会。

一:数据库基础知识

Innodb引擎

Innodb引擎提供了对数据库ACID事务的支持,并且实现了SQL标准的四种隔离级别,关于数据库事务与其隔离级别的内容请见数据库事务与其隔离级别这篇文章。该引擎还提供了行级锁和外键约束,它的设计目标是处理大容量数据库系统,它本身其实就是基于MySQL后台的完整数据库系统,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT(*) FROM TABLE时需要扫描全表。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率。但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。

MyIASM引擎

MyIASM是MySQL默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。不过和Innodb不同,MyIASM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyIASM也是很好的选择。

唯一索引(聚集索引)

单个表只能有一个唯一索引,索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。数据存储结构和索引存储结构顺序一致。(一般主键为唯一索引)

创建单列索引:CREATE UNIQUE  INDEX indexName ON tableName(tableColumns(length));如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB 和 TEXT 类型,必须指定length。

创建组合索引:CREATE UNIQUE  INDEX indexName ON tableName( `column1`, `column2`, `column3` );

删除索引:DROP INDEX indexName;

非聚集索引

单个表可以有多个非聚集索引,可以是单列也可以是组合索引,数据存储结构和索引存储结构顺序无关。

创建单列索引:CREATE INDEX indexName ON tableName(tableColumns(length));如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB 和 TEXT 类型,必须指定length。

创建组合索引:CREATE INDEX indexName ON tableName( `column1`, `column2`, `column3` );

删除索引:DROP INDEX indexName;

组合索引

创建组合索引:CREATE INDEX indexName ON tableName( `column1`, `column2`, `column3` );

对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。

例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b|c|b,c进行查找 ,当最左侧字段是常量引用时,索引就十分有效。(组合索引最多2-3列)

视图与存储过程

这两块的内容可以更具具体的业务需要进行建立,一般对于查询较多的相似组合的表,或者需要隐藏原表信息的可以合并提供查询视图,对于复杂业务和需要特殊效率的业务可以提供存储过程。

常用函数

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

以下内容来自请去这里查看更详细  http://www.jb51.net/article/40179.htm

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

1、聚合函数(常用于GROUP BY从句的SELECT查询中)
AVG(col)返回指定列的平均值
COUNT(col)返回指定列中非NULL值的个数
MIN(col)返回指定列的最小值
MAX(col)返回指定列的最大值
SUM(col)返回指定列的所有值之和
GROUP_CONCAT(col) 返回由属于一组的列值连接组合而成的结果

2、字符串函数
CONCAT(s1,s2...,sn)将s1,s2...,sn连接成字符串
CONCAT_WS(sep,s1,s2...,sn)将s1,s2...,sn连接成字符串,并用sep字符间隔
LCASE(str)或LOWER(str) 返回将字符串str中所有字符改变为小写后的结果
REVERSE(str) 返回颠倒字符串str的结果

3、日期和时间函数
CURDATE()或CURRENT_DATE() 返回当前的日期
CURTIME()或CURRENT_TIME() 返回当前的时间
DATE_ADD(date,INTERVAL int keyword)返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:SELECTDATE_ADD(CURRENT_DATE,INTERVAL 6 MONTH);
DATE_FORMAT(date,fmt)  依照指定的fmt格式格式化日期date值
DATE_SUB(date,INTERVAL int keyword)返回日期date加上间隔时间int的结果(int必须按照关键字进行格式化),如:SELECTDATE_SUB(CURRENT_DATE,INTERVAL 6 MONTH);
DAYOFWEEK(date)   返回date所代表的一星期中的第几天(1~7)
DAYOFMONTH(date)  返回date是一个月的第几天(1~31)
DAYOFYEAR(date)   返回date是一年的第几天(1~366)
DAYNAME(date)   返回date的星期名,如:SELECT DAYNAME(CURRENT_DATE);
FROM_UNIXTIME(ts,fmt)  根据指定的fmt格式,格式化UNIX时间戳ts
HOUR(time)   返回time的小时值(0~23)
MINUTE(time)   返回time的分钟值(0~59)
MONTH(date)   返回date的月份值(1~12)
MONTHNAME(date)   返回date的月份名,如:SELECT MONTHNAME(CURRENT_DATE);
NOW()    返回当前的日期和时间
QUARTER(date)   返回date在一年中的季度(1~4),如SELECT QUARTER(CURRENT_DATE);
WEEK(date)   返回日期date为一年中第几周(0~53)
YEAR(date)   返回日期date的年份(1000~9999)

4、控制流函数
MySQL有4个函数是用来进行条件操作的,这些函数可以实现SQL的条件逻辑,允许开发者将一些应用程序业务逻辑转换到数据库后台。

MySQL控制流函数:
CASE WHEN[test1] THEN [result1]...ELSE [default] END如果testN是真,则返回resultN,否则返回default
CASE [test] WHEN[val1] THEN [result]...ELSE [default]END  如果test和valN相等,则返回resultN,否则返回default
IF(test,t,f)   如果test是真,返回t;否则返回f
IFNULL(arg1,arg2) 如果arg1不是空,返回arg1,否则返回arg2
NULLIF(arg1,arg2) 如果arg1=arg2返回NULL;否则返回arg1
这些函数的第一个是IFNULL(),它有两个参数,并且对第一个参数进行判断。如果第一个参数不是NULL,函数就会向调用者返回第一个参数;如果是NULL,将返回第二个参数。

代码如下:

SELECT CASE ‘green‘
     WHEN ‘red‘ THEN ‘stop‘
     WHEN ‘green‘ THEN ‘go‘ END;
SELECT CASE 9 WHEN 1 THEN ‘a‘ WHEN 2 THEN ‘b‘ ELSE ‘N/A‘ END;
SELECT CASE WHEN (2+2)=4 THEN ‘OK‘ WHEN(2+2)<>4 THEN ‘not OK‘ END ASSTATUS;
SELECT Name,IF((IsActive = 1),‘已激活‘,‘未激活‘) AS RESULT FROMUserLoginInfo;
SELECT fname,lname,(math+sci+lit) AS total,
CASE WHEN (math+sci+lit) < 50 THEN ‘D‘
WHEN (math+sci+lit) BETWEEN 50 AND 150 THEN ‘C‘
WHEN (math+sci+lit) BETWEEN 151 AND 250 THEN ‘B‘
ELSE ‘A‘ END
AS grade FROM marks;
SELECT IF(ENCRYPT(‘sue‘,‘ts‘)=upass,‘allow‘,‘deny‘) AS LoginResultFROM users WHERE uname = ‘sue‘;#一个登陆验证

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

二:数据库设计

在官方学习的时候这部分是要符合三范式规则的,但是这种规则下对于大多数的数据业务来说都是在理论上太完整,不太实用,所以可以学习这种设计的思想,但是适不适用可以按照自己的业务规划。

在设计数据库的过程主要可以参考以下几个方向(个人总结):

1.首先分析自己的业务,抽象好数据对象以及对象之间的关联关系。

2.对于通用的一些数据字段可以抽象总结出来,比如创建时间,更新时间,操作者。。。这些通用的字段。

3.针对自己的业务主要分析查询的部分,对于重复查询较多,修改机会较少的字段可以适当的在多个表中进行冗余,以提高查询和简化sql代码的复杂度。

4.在建表时可以考虑后期业务的扩展性,但是不必强制流出字段等,因为业务变化比较平凡,过多的预留会让表看起来非常混乱。

5.当业务扩展性和项目需求有冲突时可以优先考虑项目需求,至于扩展性可看业务发展再定,甚至修改。(个人观点,可不理会)

6.做好字段说明,备注。

三:sql优化(只是优化的方向和原则)

1.级联查询优化,多个单标查询的优化,可以考虑用多表级联查询优化。

2.考虑索引使用情况优化,对于破坏索引,未使用索引的sql,可以考虑建立索引或者使现有索引生效方面优化。

3.对于大数据量分页的优化。

4.通过分析业务,用更多的条件确定更少的列。

四:数据库架构

1.对于大数据和有读写压力的业务可以考虑从几个方向去设计

表分区:http://www.cnblogs.com/freeton/p/4265228.html  这个网址写的不错,值得浏览下。

分表存储:按业务需求可以有水平分表和垂直分表两种不同的技术。

        水平分表是按照一定的规则将一个大的表格水平分割到不同的子表中,所以每个表格的列都是相同的。

     垂直分表是将一个大的表格按照不同的业务需求把不同的列分割到不同的子表中,以某一个相同的属性(例ID)关联起来。

     对于分表后的查询可以按照业务先进行逻辑判断,然后定位到某个子表。对于一些统计功能,则循环所有子表,合并。

分库技术:就是采用不同的数据库部署数据库集群,可以搜搜MyCat中间件。

读写分离:http://blog.csdn.net/zoomyj/article/details/50610349  这片文章写了好多 有兴趣的可以多了解下,作为一个了解和积累。

总结:零零散散写了一些,这里写的主要是一些方向性的东西,可能没有具体的一些实现或者是代码。所以只是一个指引,希望能帮助大家在这些方面去学习,去积累。也有一些东西是网络摘抄的,只要是好的就学习吧。

以上内适用一到三年java开发面试,个人见解,值得参考,觉得适用的顺手推荐下,让更多的人看到

最后分享一个不错的鸡汤给想要干事的朋友们,祝大家成功!http://www.iheima.com/zixun/2017/0628/163820.shtml

时间: 2024-10-13 12:12:48

面试提高及日常学习积累(二)——数据库篇的相关文章

EF 学习系列二 数据库表的创建和表关系配置(Fluent API、Data Annotations、约定)

上一篇写了<Entity Farmework领域建模方式 3种编程方式>,现在就Code First 继续学习 1.数据库表的创建 新建一个MVC的项目,在引用右击管理NuGet程序包,点击浏览搜索EF安装,我这里主要是EF6.0 以上的学习 所以都安装6.0 以上的版本 接下来在Model文件夹下面创建一个Customer类 public class Customer { public int ID { get; set; } public string Name { get; set; }

IOS项目练习 之 &quot;爱限免&quot; 项目笔记(二) - 数据库篇

在这个练习项目中我们用到了Sqlite3 数据库,这里使用了第三方开源库FMDB,但是直接操作FMDB太麻烦了,所以又在上面加了一层封装; 为了保证代码的通用性,我写的时候尽量将实体和数据库操作分离,实在没有办法分离的地方就使用预编译命令代替,下面是我的数据库封装的代码 1 // 2 // DatabaseManager.h 3 // FreeLimit 4 // 5 // Created by TBXark on 15-4-10. 6 // Copyright (c) 2015年 TBXark

Android:日常学习笔记(10)———使用LitePal操作数据库

Android:日常学习笔记(10)---使用LitePal操作数据库 引入LitePal 什么是LitePal LitePal是一款开源的Android数据库框架,采用了对象关系映射(ORM)的模式,将平时开发时最常用的一些数据库功能进行了封装,使得开发者不用编写一行SQL语句就可以完成各种建表.増删改查的操作.并且LitePal很"轻",jar包大小不到100k,而且近乎零配置,这一点和Hibernate这类的框架有很大区别.目前LitePal的源码已经托管到了GitHub上. 关

项目积累(二)细节问题,提高用户体验

前两天和同事讨论公司系统一个身份证录入文本框,发现还有一个要录入年龄的文本框,都感觉挺麻烦的.其实当录入身份证号后,年龄就是固定的,想到这就动手写jQuery来改进系统,提高用户体验. 首先,身份证从第七位开始时年龄段,如:410223199910210000,这样,就获取身份证的从第七位开始和接下来的八位.在获取当前时间,相减获取年龄.这样 做还是不是准确的,还要考虑月份和具体每天.代码如下: 1 var nowDate = new Date(); 2 var month = nowDate.

oracle学习入门系列之二 数据库基础知识

oracle学习入门系列之二 数据库基础知识 本篇蛤蟆要梳理下那些被淡忘的数据库基础知识,也许根本就没被人记住过.不管是哪种情况,该记住的必须记住,记不住就把他记下来吧. 首先问几个问题如下: 数据库基础知识是什么? 好吧,蛤蟆直接吐后而不亡,看目录开始吧. 本人邮箱:[email protected] 微信公众号:HopToad 欢迎各界交流 1      基本概念 概念就是概念,大伙对这些名词不要死磕,但是对定义一定要理解,理解方能领悟,领悟方能运用自如后创新. 1.1      数据 数据

MariaDb数据库管理系统学习(二)使用HeidiSQL数据库图形化界面管理工具

HeidiSQL 是一款用于简单化的 MySQL 服务器和数据库管理的图形化界面.该软件允许你浏览你的数据库,管理表,浏览和编辑记录,管理用户权限等等.此外,你可以从文本文件导入数据,运行 SQL查询,在两个数据库之间同步表以及导出选择的表到其它数据库或者 SQL 脚本当中.HeidiSQL 提供了一个用于在数据库浏览之间切换 SQL 查询和标签带有语法突出显示的简单易用的界面.其它功能包括BLOB 和 MEMO 编辑,大型 SQL 脚本支持,用户进程管理等.该软件资源开放. MariaDB安装

基于CentOS的Mysql学习补充二--使用Shell创建数据库

文章出处:基于CentOS的Mysql学习补充二--使用Shell创建数据库 关于使用基于命令使用mysql数据库的方法可见文章<基于CentOS的Mysql的使用说明>,本文只要介绍如何使用Shell脚本来创建我们想要的数据库,下面给出我创建数据库的Shell脚本,基本也就是将mysql的一些命令放在shell脚本里面而已. #!/bin/bash #Author: chisj #Time: 2015.7.22 #Describe: Create Database #The username

【转载】JAVA学习路线二

JAVA学习路线二------------高阶面试 作者:Java高级进阶链接:https://zhuanlan.zhihu.com/p/35301291来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 1.hashcode相等两个类一定相等吗?equals呢?相反呢? 2.介绍一下集合框架? 3.hashmap hastable 底层实现什么区别?hashtable和concurrenthashtable呢? 4.hashmap和treemap什么区别?低层数据结

课外学习笔记(二)

程序员的思维修炼 开发认知潜能的第九堂课 我上班的每一天都有个习惯,就是打开51cto下载中心,看看首页上有没有什么好的书推荐下载,这一天就是这本书<程序员的思维修炼>.Andy Hunt我觉得是一个很了不起的思想者,他在书中所阐述的一些想法很让人茅塞顿开.我们并不需要一定按照他书中所写的东西来要求自己,但是可以从他的书中能学到些适合自己的东西就是对自己最大的帮助,我觉得作为程序员的我看一看这本书是很有帮助的.它能给你一些启发,一些灵感对于自己所从事的行业.这本书我认为不仅仅适合程序员去读,它