清屏快捷键 ctrl+l
1,查看系统版本:getconf LONG_BIT
2,linux下解压mysql提示“旧选项f需要参数” 意思是你要加个f参数
tar xvfz mysql.xx.tar.gz
这样解压
如果需要指定目录 后面加上路径 就可以了
3,切换目录 cd $HOME
4,登陆mysql # mysql -u root
退出: exit
5,进入 mysql mysql -u root -p
展示表空间 show databases;
切换表空间 use 表空间名字;
6,保存编辑文件 按ESC :wq!
7,到根目录 cd /
8,设置utf-8 格式 vim /ect/my.cnf 在[mysqld] 下面添加 character_set_server = utf8 ,如果还是乱码重新创建表空间 因为原来的表空间用的格式还是拉丁文
windows系统 frm文件 存放表结构
myd(d =data )文件 存放表数据
myi(i = index) 文件 存放表索引
MySql 架构层次
1,连接层 eg:jdbc..等
2,服务层 DDL,DML,DQL语句
3,引擎层 相应的语句调用相应的引擎(这样可以优化查询速度,引擎层也可以自己去做)
4,存储层 与硬盘的底层打交道,那数据写入 或者传输
查看Mysql 引擎 : show engines;
查看关闭的引擎 : show variables like '%storage_engine%';
MyISAM 和 InnoDB 的区别
MyISAM 不支持事务 而 InnoDB 支持事务,这样就导致MyISAM查询较快 而InnoDB事务就会导致查询较慢
SQL 分析
单值索引:
Eg:
给user表中的name 字段建索引
Create index idx_user_name on user(name) //idx = 索引 + 表名+ 字段
复值索引:
Eg:
给user表中的name ,email字段建索引
Create index idx_user_nameEmail on user(name,email) //idx = 索引 + 表名+ 字段
SQL JOINS的几种连接方式
create table tbl_dept(
id int(11) not null auto_increment,
deptName varchar(30) default null, (部门名称)
locAdd varchar(40) default null,(所在楼层)
primary key(id)
) engine = innodb auto_increment = 1 default charset = utf8;
create table tbl_emp(
id int(11) not null auto_increment,
name varchar(30) default null,
deptid int(11) default null, (部门ID)
primary key(id),
key fk_dept_id(deptid)
#constraint fk_dept_id foreign key (deptid) references tbl_dept(id)
)
engine = innodb auto_increment = 1 default charset = utf8;
insert into tbl_dept(deptName,locAdd) values('RD',11);
insert into tbl_dept(deptName,locAdd) values('HR',12);
insert into tbl_dept(deptName,locAdd) values('MK',13);
insert into tbl_dept(deptName,locAdd) values('MIS',14);
insert into tbl_dept(deptName,locAdd) values('FD',15);
insert into tbl_emp(name,deptid) values('z3',1);
insert into tbl_emp(name,deptid) values('z4',1);
insert into tbl_emp(name,deptid) values('z5',1);
insert into tbl_emp(name,deptid) values('w5',2);
insert into tbl_emp(name,deptid) values('w6',2);
insert into tbl_emp(name,deptid) values('s7',3);
insert into tbl_emp(name,deptid) values('s8',4);
insert into tbl_emp(name,deptid) values('s9',51);
为例
Emp表数据如图:
![这里写图片描述](https://img-blog.csdn.net/20180124125343662?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE5MjA0NDc5Mzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
Dept表数据如图:
![这里写图片描述](https://img-blog.csdn.net/20180124125426871?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE5MjA0NDc5Mzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
1. 交集
即 员工一定部门,部门一定有员工
![这里写图片描述](https://img-blog.csdn.net/20180124125510665?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE5MjA0NDc5Mzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
Select * from tbl_emp a join tbl_dept b on a.deptid = b.id
2. A的集合(包括A B相等的集合)
即 查询出所有员工对应的部门 没有部门的补null
![这里写图片描述](https://img-blog.csdn.net/20180124125554402?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE5MjA0NDc5Mzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
Select * from tbl_emp a left join tbl_dept b on a.deptid = b.id
3.查询出员工表中 没有部门的员工
![这里写图片描述](https://img-blog.csdn.net/20180124125630341?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE5MjA0NDc5Mzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
Select * from tbl_emp a left join tbl_dept b on a.deptid = b.id
Where b.id is null
4.查询出所有员工对应的所有部门,员工没有部门的和部门中没有员工的都查出来
![这里写图片描述](https://img-blog.csdn.net/20180124125707355?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE5MjA0NDc5Mzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
注:mysql 没有full outer
所以:
Select * from tbl_emp a left join tbl_dept b on a.deptid = b.id
Union
Select * from tbl_emp a right join tbl_dept b on a.deptid = b.id
//查询出A 的集合 和B的集合的并集 就等同于 full outer
Union 有去重功能
5.查询出员工表中没有部门的人 以及部门表中没有员工的人
![这里写图片描述](https://img-blog.csdn.net/20180124125751745?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE5MjA0NDc5Mzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
Select * from tbl_emp a left join tbl_dept b on a.deptid = b.id
Union
Select * from tbl_emp a right join tbl_dept b on a.deptid = b.id
Where a.deptid is null
And b.id is null
索引
官方解释:索引就是数据结构
查看索引:show index from TableName;
执行计划
Explain
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
Id
1) Id 相同,执行顺序由上至下
2) Id 不同 id值越高执行顺序越高
3) Id 相同不同,同时存在 (子查询) 先执行子查询的内容 然后再执行外面的内容
Select_tyle
1) Primary 最后执行的
2) Simple 简单的
3) Union 联合
4) …
Table
表名
Type
从最好到最差依次是:
System>const>eq_ref>ref>range>index>all
System
表中只有一条记录
Const
表中只匹配一条记录 eg. Where id = xxx
Eq_ref
唯一索引扫描,只匹配到一条记录
Ref 非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以他应该属于查找扫描的混合体
Eg. 在emp 表中 创建复合索引
1),Create index inde_emp_name_age on tbl_emp(name,age)
2).select * from tbl_emp e
Where name = ‘z3’
注:此处 name 查出来的记录只有一条 (也就是说name = z3 只匹配到一条记录)
Range:
in, between , > <
Index :
对btree 遍历 查询的速度肯定会比all快
possible_keys
显示可能应用在这张表中的索引,一个或多个.查询设计到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用
key
实际使用的索引.如果没null ,则没有使用索引
查询中若使用了覆盖索引,则该索引仅出现在key列表中
Eg. 在emp 表中 创建复合索引
1),.Create index inde_emp_name_age on tbl_emp(name,age)
2) .explain select name,age from tbl_emp
3).此时 possible_keys(MySQL认为可能用到的索引没有,实际上查询的字段和建立的复合索引刚好吻合,所以key 用到了inde_emp_name_age 索引 )
![这里写图片描述](http://img.blog.csdn.net/20180124125933471?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE5MjA0NDc5Mzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
key_len
1) 限制查询的结果越多(where 后面跟的条件越多),key_len精度越大
2) 同样的查询结果 精度越小越好 也就是说限制条件越少越好
Extra
1).Useringfilesort(虽然建了索引,但是还是使用了MySQL自己的索引)
![这里写图片描述](http://img.blog.csdn.net/20180124130103942?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE5MjA0NDc5Mzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
2).Using temporary (使用临时表)
![这里写图片描述](http://img.blog.csdn.net/20180124130157099?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcXE5MjA0NDc5Mzk=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
Between ,in , type 都输出range
因为此处查出来的数据会作为一张临时表存在,然而在排序的时候又没有遵循建立索引的先后顺序 所以会出现usingfilesort 又因为此处用到了临时表 所以出现了 , Using temporary