数据库基础

Posted lishisan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库基础相关的知识,希望对你有一定的参考价值。

数据库

基本语法

聚合函数

AVG()

COUNT()

MIN()

MAX()

SUM()

GROUP_COUNT(col)返回属于一组的列值连接组合而成的结果

表连接

内连接

外链接

交叉连接

自连接

子查询 IN ?NOT IN ?EXIST \NOT EXIST?= <>

子查询低于连接查询

事务的四个属性 原子性一致性隔离性持久性ACID

事务的四种隔离级别

1.read uncommitted(未提交读) 脏读

2.read committed提交读

3.repeatable read可重复读

4.serializable(可串行化) 最高隔离级别

MySQL中的事务

事务的实现基于数据库的存储引擎 不同的存储引擎对事物的支持度不一样

mysql的存储引擎支持事务的innoDB

事务的隔离级别分别是通过锁实现的,而事务的原子性一致性持久性是通过事务日志实现的

事务日志 重做日志redo undo只要为事务的回滚服务

索引

一种特殊的文件,InnoDB数据表上的索引是表空间的一个组成部分,包含数据表里所有文件的指针

索引是创建在数据库表对象上的,由表中的一个字段或者多个字段生成的键组成.这些键存储在数据结构上(B-树或者哈希表) 通过mysql可以快速有效的查找与兼职相关联的字段

根据存储类型分为B-树(InnoDB\MyISAM)和哈希索引(Memoery)

索引分类

普通索引最基本的索引无任何限制myiasm中默认的Btree类型的索引

--直接创建
create INDEX index_name ON table (colum(length))
--修改表结构添加
alter Table table_name ADD INDEX index_name ON (colum(length))
--创建表时同时创建索引
create table'table_name'(
'id' int(11) NOT NUll AUTO_increment,
'title' char(255) character set utf8 collate utf8_general_ci NOT NULL,
'content' character set utf8 collate utf8_general_ci NULL,
'time' int(10) NULL default NULL,
primary key('id'),
INDEX index_name (title(length))
)
--删除索引
DROP INDEX index_name ON table_name

唯一索引

--创建唯一索引 与普通类似 索引的列必唯一 但可有空值
create unique index ON table (colum(length))

主键索引 一支特殊的唯一索引不允许有空值

全文索引

FULLTEXT索引仅仅可用于MyISAM表
大容量的表使用全文索引索然速度更快,但产生全文索引是一个非常消耗时间和磁盘的做法

组合索引(最左前缀)

指定索引列时指定多个列
只有查询条件中使用了所关联的字段中的第一个索引字段,多列索引才会被使用

创建索引的情况

经常在where后出现的字段

分组所用的字段即groupby后边的字段

主键或者外键字段

设置有唯一完整性约束的字段

不适合创建索引的字段

查询中很少使用的\拥有很多重复值的字段

索引失效

  • 使用or时索引失效,两者都想用需将or条件没咧都加索引
  • like查询以%开头
  • 多列索引不是使用第一部分索引则不会被使用
  • 列类型是字符串,条件需将数据用引号括起来
  • mysql中估计使用全表扫描比使用索引快,则不使用索引
  • 对索引列进行运算导致索引失效
  • 独立的列(聚合运算\类型转换)
  • join操作中,mysql只有在主键和外键的数据类型相同才会使用索引
  • 索引不会包含有NULL值的列,索引创建字段不要让默认值为NULL
  • not in 和<>操作不会使用索引,可用not exist和> or <代替

索引的查看与优化

show table like "Handler_read%";--查看索引

索引优化

  1. 索引不回包含有null的列 创建表时不要让字短的默认值为null
  2. 使用短索引
  3. 索引列排序
  4. 不要在索引列上进行运算

存储过程

一组预编译的SQL语句集

  1. 只需创建一次过程后续重复使用
  2. 允许更快执行,大量重复操作存储过程比SQL语句更快
  3. 减少网络流量
  4. 更好地安全机制

  1. 可移植性差,多个类型的数据库
  2. 学习成本高
  3. 复杂运算增加服务端成本,对集中性数据库可能会导致扩展性问题

存储过程的使用

存储过程

create procedure Rroc()
Begin 
Select * from tb_person;
END;

存储函数

create function QUery_score(classID INT,studentID INT)
returns INT return
(select grage from tb_score where cID=classID and sID=studentID);

两者区别

  1. 存储过程更加复杂 函数功能针对性较强
  2. 存储过程可以返回参数,函数返回单一值或者表对象
  3. 存储过程做一个独立部分执行,函数可以作为查询的一部分来调用.可在查询语句中位于from之后
  4. 存储过程通过关键字call来调用,函数作为select的一部分嵌入到sql语句中
  5. 当存储过程和函数被执行的时候SQLmanager会到procedure cache中取相应的查询语句,如果PC没有,SQLManager就会对存储过程和存储函数编译

应用场景

  1. 复杂的数据处理用存储过程,比如报表
  2. 多条件多表联合查询并做分页处理,用存储过程也比较合适

优化

sql优化

  1. 对查询进行优化,尽量避免全表扫描,where 和orderby的列创建索引
  2. 避免where子句中字段进行null值判断
  3. 避免where子句使用!=或者<>
  4. 避免where子句使用or,一个条件的字段无索引,引擎放弃使用索引,建议使用union all代替
  5. in 和 not in会导致全表扫描 对连续数据可用between,也可以用exist代替in
  6. like"%a%" 导致索引失效,可使用全局索引
  7. 大数据量(几百条)的表join要先分页在join,否则逻辑读会很高,性能很差
  8. 少使用*
  9. 日期适用MySQL自带,少使用字符串存储,IP使用int不要使用字符串
  10. 尽可能使用varchar和nvarchar代替char/nchar,变长字段存储空间小.查询中对字段较小的搜索效率高

数据库优化

主从复制读写分离

  • 使用spring可以实现读写分离

分库分表

  • 分表就是吧一个表分为N多个小表
  • 分库就是吧一张表分成N多个区,这些区可在不同磁盘

存储引擎

--查看MySQL的存储引擎
show engines

myisam和inndb的区别

区别 myiasm innodb
存储结构 三个文件第一个以表的名字开始.扩展名指出文件类型.frm文件存储表定义.MYD数据文件.MYI索引文件 所有表都保存在同一个文件,表的大小只受限于操作系统文件的大小,一般为2g
存储空间 可被压缩 需啊哟更多的内存和存储空间
可移植性\备份\恢复 数据是以文件的形式存储,跨平台数据转移很方便 免费的方案可以拷贝备份binlog或者mysqldump数据量达到几十个g就难受了
事务支持 不支持 提供事务支持事务
表锁差异 只支持表级锁 支持事务和行级锁
Auto_increment 可以和其他字段一起建立联合索引,自动增长列必须是索引,组合索引可以不是第一列 必须包含值又该字段的索引,自动增长列必须是索引,如果是组合索引必须是第一列
全文索引 支持FULLText类型的全文索引 不支持FullText,但可使用sphinx插件,效果更好
表主键 允许没有任何主键和索引的表存在,索引都是保存行的地址 如果没有设定主键或者非空唯一索引,会自动生成一个6字节的主键,数据是主索引的一部分,附加索引保存的是主索引的值
表的具体行数 保存有表的总行数,count(*)直接输出 没有保存总行数,count效率低,加了where,select两者相同
CRUD 适合大量select 适合大量Insert\update
外键 不支持 支持

表锁

行锁(共享锁和排它锁)

共享锁:读锁
select ...lock in share mode
排它锁:写锁
select ...for update

乐观锁和悲观锁

悲观锁
select ...for update或者lock in share mode
乐观锁
版本(version)记录机制
时间戳(timetamp)

select语句完整执行顺序

from -> where ->group by ->having ->计算式所的表达式 ->group by ->select 输出

以上是关于数据库基础的主要内容,如果未能解决你的问题,请参考以下文章

SQL基础教程的介绍

测试复习大纲

数据分析指北 - 基础(基础数据操作之一)

网络基础+数据库基础笔记

MySQL基础二---基础介绍

MySQL基础二---基础介绍