数据库原理 之MySQL

 

数据库种类:

关系型数据库: mysql 专注于数据安全 和功能 ,存取时 会有表的结构化操作
解析sql语句---- 丢给磁盘存取 ----取出,结构化成表

常用关系型数据库产品介绍
oracle数据库
Oracle前身叫SDL、由Larry Ellison和两个变成任意在1977创办,他们开发了主机的拳头产品,在市场上大量销售。Oracle公司是最早开发关系型数据库的厂商之一,其产品支持最广泛的操作系统平台。目前Oracle关系数据库产品的市场占有率数一数二
Oracle公司是目前全球最大的数据库软件公司,也是近年业务增长极为迅速的软件提供与服务商
主要应用范围:传统大企业、大公司、政府、金融、证券等。
版本升级:oracle8i,oracle9i,oracle10g,oracle11g,oracle12c

MySQL


MySQL被广泛的应用在Internet上的大中小型网站中。由于体积小、速度快、总体拥有成本低,开放源代码


非关系型数据库: 高性能、高并发、对数据一致性要求不高 。 json格式存取,怎么放进去,怎么拿出来

NOSQL非关系型数据库小结:
1、NOSQL不是否定关系数据库,而是作为关系数据库的一个重要补充
2、NOSQL为了高性能、高并发而生,忽略影响高性能,高并发的功能
3、NOSQL典型产品memcached (纯内存),redis(持久化缓存),mongodb(文档的数据库)

redis特点:
依然高性能高并发
数据持久化功能
支持多数据类型,主从复制和集群
管理不再使用SQL

 


 

About MySql:

 一、mysqld的三层结构                                                        

1.守护进程是什么?

  Linux Daemon(守护进程)是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务,不是对整个系统就是对某个用户程序提供服务。Linux系统的大多数服务器就是通过守护进程实现的。常见的守护进程包括系统日志进程syslogd、 web服务器httpd、邮件服务器sendmail和数据库服务器mysqld等。

  守护进程一般在系统启动时开始运行,除非强行终止,否则直到系统关机都保持运行。守护进程经常以超级用户(root)权限运行,因为它们要使用特殊的端口(1-1024)或访问某些特殊的资源。

  一个守护进程的父进程是init进程,因为它真正的父进程在fork出子进程后就先于子进程exit退出了,所以它是一个由init继承的孤儿进程。守护进程是非交互式程序,没有控制终端,所以任何输出,无论是向标准输出设备stdout还是标准出错设备stderr的输出都需要特殊处理。守护进程的名称通常以d结尾,比如sshd、xinetd、crond等

2.mysqld(后台进程,守护进程) 启动时:

  1、自动派生 master thread ------生成工作线程(read write 等)
  2、预分配内存区域

3.实例是什么: 后台进程 +线程 +预分配内存区域

4.SQL类型:

    DDL:数据库对象定义语言
        对库和表的定义
    DML:操作语言
    DCL:控制语言

5.mysqld的三层结构:

 结构化的查询语言:select * from user;
  执行该语句时:
  1、连接层:
      验证 该用户的用户名、密码、端口号,并提供连接
    连接层作用: 1。提供连接协议(TCP/IP socket)
           2. 验证功能身份信息
           3、提供一个专门的连接线程(接受用户发来的SQL语句,并在执行完成之后返回最终结果,但不能读和执行sql语句,会将SQL语句丢给下一层)
  2、SQL层 (与优化相关)
        1、接收上层发来的SQL
        2、语法检查模块进行语法检查
        3、语义检查模块检查语义,分辨SQL语句的类型,将不同种类的语句,交给不同的解析器
        4、解析器接收到SQL语句,进行解析操作,得到语句的执行计划(explain)
        5、优化器负责基于 “开销” 找到执行开销最小的执行计划 (优化SQL,让优化器选择最有的执行方式,了解优化器的规则)
        6、执行器基于优化器的选择,执行SQL语句,并得到获取数据的方法,交由下一层继续处理
        7、接收存储引擎层取到的二进制数据,结构化成表
        8、查询缓存:SQL语句的 哈希值+数据结果(在修改类业务操作很多的情况下,并不适用)---》redis Tair(memcached)
  3、存储引擎层
        1、根据上层获取数据的方法,将数据提取出来
        2、重新再交给SQL层
    MYSQL数据库的核心,关系到数据库性能,运维相关

 二、用户权限                                                           

1.权限分类:

ALL privileges(所有权限)
SELECT, INSERT, UPDATE, DELETE, CREATE, RELOAD,
SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER,
SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES, DROP
LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT,
CREATE VIEW, SHOW VIEW, CREATE ROUTINE,
ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE

2、开发人员可能会用到的权限

  create、 update、 insert、  select、  CREATE VIEW、  CREATE ROUTINE、     SHOW VIEW 、CREATE TEMPORARY TABLES、  ALTER

3、用户

  用户组成:

    用户名@‘主机范围’
    用户名通常和数据库的名字保持一致
    主机范围被称之为白名单

4、主机范围:

  即IP地址范围,有如下几种写法:

  10.0.0.200              -------->指定就这一个

  oldboy.o.o.%           -------> 10.0.0.1--10.0.0.254 范围的ip地址

  10.0.0.5%               -------> 10.0.0.50-- 10.0.0.59

  %                            ------>所有的地址都可以

5、权限作用范围

*.*       ------->所有库的所有表

py.*    ------->py库的所有表

bbs.*    ------->bbs库的所有表

py.t1  ------->py库的t1表

6、设置权限的语句

  grant 权限 on 权限作用范围 to 用户 identified by '密码'

  eg:

  设置权限的语句,此句给了全部权限,*.*  指所有作用范围
  grant  all privileges   on   *.*   to   app@'10.0.0.%'     identified  by    '123'

  此句将bbs数据库的所有表的create,update,insert,select ,CREATE VIEW权限,给了 IP地址在12网段的用户(bbsuser@'192.168.12.%'),这些用户的密码是‘123’

    grant  create,update,insert,select ,CREATE VIEW   on   bbs.*   to   bbsuser@'192.168.12.%'   identified by   '123';

 

7、客户端工具中自带命令:

1、\h 或 help 或 ?
2、\G     将以表格形式打印的数据,变成监支队形式打印
6、source   导入sql文件
source world.sql
7、use   进入数据库

------------------------
show databases;   查看数据库列表
use world     进入目录,或数据库
show tables;      查看表列表
show tables from world;     

desc  tablename   查看表的信息

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

 

 

三、索引及执行计划                                                       

B树(默认):
B+tree
B*tree

关于B树连接地址:

  https://blog.csdn.net/u013411246/article/details/81088914


Hash 索引

  哈希索引只有Memory, NDB两种引擎支持,Memory引擎默认支持哈希索引,如果多个hash值相同,出现哈希碰撞,那么索引以链表方式存储。

  但是,Memory引擎表只对能够适合机器的内存切实有限的数据集。

  要使InnoDB或MyISAM支持哈希索引,可以通过伪哈希索引来实现,叫自适应哈希索引。

  主要通过增加一个字段,存储hash值,将hash值建立索引,在插入和更新的时候,建立触发器,自动添加计算后的hash到表里。


fulltext 全文索引

B树:
cluster indexes 聚集索引 ,随机IO变成顺序IO
辅助索引 ------>人为管控的:unique 普通的 index

 

前缀索引和联合索引

前缀索引:
根据字段的前N个字符建立索引
alter table student add note varchar(200);
alter table student add index idx_note(note(10));

联合索引:多个字段建立一个索引。

  联合主键是联合索引的特殊形式
where a女生 and b身高165 and c身材好
index(a,b,c)
特点:前缀生效特性。

 

alter table people add index idx(a,b,c);

 

a,ab,abc,ac 可以走索引或部分走索引(5.6之后 ac 可以走主键索引)

b bc c ca ba 不走索引。

  原则:把最常用来作为条件查询的列放在前面。


------------------------------
create table people(id int not null auto_increment primary key ,
name varchar(20),gender enum('m','f'),shengao int,tizhong int);

alter table people add index idx_gst(gender,shengao,tizhong);

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

主键索引

  只能有一个主键。

  主键索引:列的内容是唯一值,例如学号.

  表创建的时候至少要有一个主键索引,最好和业务无关。

普通索引

  加快查询速度,工作中优化数据库的关键。

  在合适的列上建立索引,让数据查询更高效。

create index index_name on test(name);
alter table test add index index_name(name);

用了索引,查一堆内容。

  在where条件关键字后面的列建立索引才会加快查询速度.

select id,name from test where state=1 order by id group by name;

唯一索引

  内容唯一,但不是主键。

create unique index index_name on test(name);

 

执行计划:                                                                      

  https://www.cnblogs.com/95lyj/p/9343481.html

SQL语句优化:                                                               

  https://www.cnblogs.com/95lyj/p/9343544.html

  

数据库索引的设计原则                                                    

  为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索引和创建什么类型的索引。

1 那么索引设计原则又是怎样的

1.选择唯一性索引

  唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。

  例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。

2.为经常需要排序、分组和联合操作的字段建立索引

  经常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作会浪费很多时间。

如果为其建立索引,可以有效地避免排序操作。

3.为常作为查询条件的字段建立索引

  如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,

  为这样的字段建立索引,可以提高整个表的查询速度。

4.限制索引的数目

  索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间。

5.尽量使用数据量少的索引

  如果索引的值很长,那么查询的速度会受到影响。例如,对一个CHAR(100)类型的字段进行全文检索需要的时间肯定要比对CHAR(10)类型的字段需要的时间要多。

6.尽量使用前缀来索引

  如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。

7.删除不再使用或者很少使用的索引

  表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。

8.小表不应建立索引

  包含大量的列并且不需要搜索非空值的时候可以考虑不建索引

 

 

 

posted @ 2018-07-20 21:17  道友请多指教  阅读(3127)  评论(0编辑  收藏  举报