了解Mysql

Posted ptxxc

tags:

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

 什么是多表关联查询?

根据多表连接查询返回的结果,分为三类

内连接(inner join)

外连接(outer join)

交叉连接(  cross join)

 

交叉链接

交叉连接的关键字CROSS JOIN

交叉连接的表现行数相乘列数相加

交叉连接(笛卡尔积)返回被连接的两个表所有数据行的笛卡尔积,

返回结果集合中的数据行数等于第一个表中符合查询条件的数据行数乘以第二个表中符合查询条件的数据行数。

 

交叉连接(笛卡尔积)语法:

SELECT * FROM table1 CROSS JOIN table2;
SELECT * FROM table1 JOIN table2;
SELECT * FROM table1 , table2;

 

隐式交叉连接

SELECT  * FROM A, B

显式交叉连接

SELECT  *  FROM  A  CROSS  JOIN  B

例如数据库中两张表,Teacher表和 Course表,如下图所示:

技术图片

 

SQL 交叉连接语句(纯粹连接查询):

SELECT * FROM Teacher , Course;

输出结果:

技术图片

 由于交叉连接(笛卡尔积)返回的结果为被连接的两个数据表的乘积,

 当数据表量太多的时候,查询会非常慢,一般使用LEFT JOIN或者RIGHT JOIN。

内连接

内连接的关键字INNER JOIN

内连接也叫连接,是最早的一种连接。还可以被称为普通连接或者自然连接,内连接是从结果表中删除与其他被连接表中没有匹配行的所有行,所以内连接可能会丢失信息。

 

数据库数据:

技术图片           技术图片

book表                                              stu表

隐式内连接

SELECT  *  FROM  A,B  WHERE A.id = B.id

显式内连接

SELECT  *  FROM  A  INNER JOIN  B ON A.id = B.id

内连接用法

select * from book as a,stu as b where a.sutid = b.stuid

select * from book as a inner join stu as b on a.sutid = b.stuid

技术图片

 

外连接

左联接:是以左表为基准,将a.stuid = b.stuid的数据进行连接,然后将左表没有的对应项显示,右表的列为NULL

select * from book as a left join stu as b on a.sutid = b.stuid

技术图片

右连接:是以右表为基准,将a.stuid = b.stuid的数据进行连接,然以将右表没有的对应项显示,左表的列为NULL

select * from book as a right join stu as b on a.sutid = b.stuid

技术图片

外连接总结

通过业务需求,分析主从表

如果使用LEFT JOIN则主表在它左边

如果使用RIGHT JOIN则主表在它右边

查询结果以主表为主从表记录匹配不到则补null

 

分页查询

mysql的分页关键字是:LIMIT

LIMIT关键字不是SQL92标准提出的关键字它是MySQL独有的语法

通过Limit关键字MySQL实现了物理分页

分页分为逻辑分页和物理分页

逻辑分页将数据库中的数据查询到内存之后再进行分页

物理分页通过LIMIT关键字直接在数据库中进行分页最终返回的数据只是分页后的数据

 

基本格式:

SELECT * FROM articles WHERE ORDER BY id LIMIT 50, 10 ;

子查询:

子查询是一个嵌套在SELECT、INSERT、UPDATE或DELETE语句,或者其他子查询中的查询,任何允许使用表达式的地方都可以使用子查询。并且提供了使用单个查询访问多个表中数据的方法。(不建议使用因为性能不太好)

 

MySQL架构

逻辑架构图

技术图片

 MySQL逻辑结构可以看成是二层架构,第一层我们通常叫做SQL Layer,在MySQL 数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断,sql解析,执行计划优化,query cache 的处理等等;第二层就是存储引擎层,我们通常叫做StorageEngine Layer,也就是底层数据存取操作实现部分,由多种存储引擎共同组成。

 

           简单逻辑架构图

技术图片

  执行流程

技术图片

 

 

 存储引擎介绍:

 多存储引擎是mysql有别于其他数据库的一大特性;

 存储引擎是针对表的

 MySQL 5.5之后默认的存储引擎由MyISAM变为InnoDB

 查看存储引擎show engines;

技术图片

 

 

日志文件:

MySQL通过日志记录了数据库操作信息和错误信息。常用的日志文件包括错误日志、二进制日志、查询日志、慢查询日志和 InnoDB 引擎在线 Redo 日志中继日志等。

 

错误日志: 它包含启动和关闭问题以及任意根据错误的细节。此日志通常名为hostname.err.

 

查询日志:它记录所有MySQL活动,在诊断问题是非常有用。日志文件可能会很快的变得非常大,因此不应该长期使用它。此日志通常名为hostname.log

二进制日志: 它记录更新过数据(或者可能更新过数据)的所有语句。此日志通常名为hostname-bin

缓慢查询日志: 顾名思义,词日志记录执行 缓慢的任何查询。这个日志在确定数据库何处需要优化很有用。此日志通常名为hostname-slow.log

事务日志 事务日志(InnoDB特有的日志)也叫redo日志。文件名为"ib_logfile0"和“ib_logfile1”,默认存放在表空间所在目录。

                   还有一个日志文件叫undo 日志默认存储在ib_data目录下

中继日志:是在主从复制环境中产生的日志主要作用是为了从机可以从中继日志中获取到主机同步过来的SQL语句然后执行到从机中

 

索引

索引(Index)是帮助 MySQL 高效获取数据的数据结构

索引分类

主键索引
设定为主键后数据库会自动建立索引,innodb为聚簇索引
语法
随表一起建索引:CREATE TABLE customer (id INT(10) UNSIGNED  AUTO_INCREMENT ,customer_no VARCHAR(200),customer_name VARCHAR(200),  PRIMARY KEY(id) );
 
单独建主键索引:ALTER TABLE customer add PRIMARY KEY customer(customer_no); 
 
删除建主键索引:ALTER TABLE customer drop PRIMARY KEY ; 
 
修改建主键索引:必须先删除掉(drop)原索引,再新建(add)索引;
 
单值索引
即一个索引只包含单个列,一个表可以有多个单列索引
语法:
随表一起建索引:CREATE TABLE customer (id INT(10) UNSIGNED  AUTO_INCREMENT ,customer_no VARCHAR(200),customer_name VARCHAR(200),  PRIMARY KEY(id),  KEY (customer_name)  );
 
随表一起建立的索引 索引名同 列名(customer_name)
单独建单值索引:
CREATE INDEX idx_customer_name ON customer(customer_name);
删除索引:
DROP INDEX idx_customer_name ;

唯一索引

索引列的值必须唯一,但允许有空值

随表一起建索引:CREATE TABLE customer (id INT(10) UNSIGNED  AUTO_INCREMENT ,customer_no VARCHAR(200),customer_name VARCHAR(200),  PRIMARY KEY(id),  KEY (customer_name),  UNIQUE (customer_no));

建立 唯一索引时必须保证所有的值是唯一的(除了null),若有重复数据,会报错。

单独建唯一索引:CREATE UNIQUE INDEX idx_customer_no ON customer(customer_no);

删除索引:DROP INDEX idx_customer_no on customer ;

 

复合索引

即一个索引包含多个列
在数据库操作期间,复合索引比单值索引所需要的开销更小(对于相同的多个列建索引)
当表的行数远大于索引列的数目时可以使用复合索引
语法:
随表一起建索引:CREATE TABLE customer (id INT(10) UNSIGNED  AUTO_INCREMENT ,customer_no VARCHAR(200),customer_name VARCHAR(200),  PRIMARY KEY(id),  KEY (customer_name),  UNIQUE (customer_name),  KEY (customer_no,customer_name));
 
单独建索引:CREATE INDEX idx_no_name ON customer(customer_no,customer_name);
 
删除索引:DROP INDEX idx_no_name  on customer ;
 

索引的存储结构

 技术图片

 

 

 

 

 

 

 

 

以上是关于了解Mysql的主要内容,如果未能解决你的问题,请参考以下文章

从mysql的片段中加载ListView

连接MySQL出现错误:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)(代码片段

使用 json rereiver php mysql 在片段中填充列表视图

关于mysql驱动版本报错解决,Cause: com.mysql.jdbc.exceptions.jdbc4Unknown system variable ‘query_cache_size(代码片段

修改MySQL密码报错“ERROR 1819 (HY000): Your password does not satisfy the current policy requirements“(代码片段

LockSupport.java 中的 FIFO 互斥代码片段