mysql

数据库

安装数据库:sudo apy-get install mysql-server mysql-client

启动:mysql -uroot -p

开启mysql:service mysql start

停止mysql:service mysql stop

重启MySQL:service mysql restart

关系型数据库

mysql 免费 开源

非关系型数据库

数据仓库

navicat工具 65535

创建库

create database xxx;

用库

use xxx;

查表

show tables;

创建表(表头>>字段)

create table [if not exists] ccc( //[if not exists] 防止表重名,可以不写

id int(10) auto_increment[自增] primary key[索引],

name varchar(255),

age varchar(10),

sex varchar(10)

)default charset=utf8;

预览表结构

desc ccc

或 show collumns from xxx【可以加like id 只查id】【或加where Field==‘xxx’】

插入数据

insert into ccc (name,sex age) values (‘张三’,‘男’,‘20’);

select * from ccc;

枚举(子查询)

select * from stu where id in (1,2,3)[可以在写select语句]

改(男改为女)

update ccc set sex=‘女’ where id=1

删表内容

delete from ccc where id=2

删表

drop table tablename

删库

drop database 库名

Flask

pip install Flask

from flask import flask

redirect

数据库高阶

explain 加select 分析select是否优秀

RDBMS:关系型数据库

命令行链接方式:mysql -u 用户名 -p 密码 -h 服务器ip(默认localhost) -P服务器段MySQL端口号(默认3306) -D数据库名

MySQL开源,使用标准SQL语句,支持多种系统,可以拿到源码进行修改

完整型:实体完整性,域完整性,参照完整性,用户自定义完整性

自带user表:root 的自带账号,密码,权限,主机地址等信息

自带db表:用户对数据库的访问权限

自带table_priv,columns_priv:包括表级和列级的权限

自带procs_priv:对存储的权限

DCL:数据控制语言,8.0添加了角色管理

创建账户:create user 账户名(格式:nusrname@localhost 名字@可以访问的域名) IDENTIFIED BY 密码

查看用户权限:show grants for 账户名(nusrname@localhost)

账户名@% 所有域都可以访问

账户名@%.baidu.com 所有百度的子域名都可以访问

不写@。。。任何主机都可以访问

删除用户:drop user 账户名,[账户名]…

设置权限:grant xxx,[xxx]…(或者all)on xxx_level(表名) to user[密码] WITH GRANT OPTION | resource_option

grant select,update,delete on *.* to jjm@localhost with grant option;

允许远程链接:

grant all privilenges on *.* to 'root'@'%' identified by mysql with grant option
flush privileges(立刻刷新)

撤销权限:

revoke  xxx(权限) on xxx(表,可以写*.*为所有表)  from user 

修改密码:

1,登录MySQL
set password for user@loaclhost =password('新密码')
2,update
use mysql
xxxxxxxx正常数据库的更新语句
3,mysqladmin -u用户名 -p旧密码 password 新密码
4,忘记root密码或初始密码
关掉mysql
打开命令窗口,来到mysql安装目录(mysql\bin)  一般安装在根目录下的etc下的mysql
输入mysqld --skip-grant-tables
在开启一个窗口,就可以进入mysql了,修改密码了
刷新权限flush privileges
退出mysql
重启电脑

数据库备份

mysqldump -u用户名 -p密码 -h位置 数据库名 > 存储位置    备份全部
mysqldump -u用户名 -p密码 -h位置 --no-data 数据库名 > 存储位置   不备份数据,只备份结构
mysqldump -u用户名 -p密码 -h位置 --no-create-info 数据库名 > 存储位置   不备份结构,只备份数据
导出多个数据库
mysqldump -u用户名 -p密码 -h位置 --all-databases > 存储位置   
mysqldump -u用户名 -p密码 -h位置 [1,2,3,4] > 存储位置   
导入

查询

select full table; 更详细多一个表类型
查询用户信息
use mysql
select user from user
查询当前用户信息
select user();
查询当前登录的用户
select user,host,db,command from information_scheam.processlist;

数据库维护×必问

分析表语句
ANALYZE TABLE  表名1[2,3]   analyze
table:表名
Op:分析语句
Msg_type:状态
Msg_text:ok8lz
优化表语句
OPTIMIZE TABLE name(具体表名) optimize
检查表语句:
CHECK TABLE name;
修复表语句:
REPAIR TABLE name
DDL:数据定义语言

定义是什么样的库,什么样的表,什么养的结构

创建数据库

create database if not exists xxx;

删除数据库

drop databases if exists xxx;

创建表

create table  [if not exists] ccc(       //[if not exists]  防止表重名,可以不写

id int(10)  auto_increment[自增]  ,

name  varchar(255),

age varchar(10),

sex  enum('1','0'),       //枚举类型
primary key(id)

)default  charset=utf8 comment='这是注释的意思';
like set('吃饭','视角') ,  //集合类型
unique 唯一建

定义列

column_name data_type

修改表

改
alter table xxx change name(原字段名) name1(修改后的名,可以不改,但必须写) varchar(255) not null(修改后类型);
加列
alter table xxx add sex enum('1','0') not null [(first 放到最前面) (after name 放到name后面)(不写默认最后)];
删
alter table xxx drop love;
加主键
alter table xxx add primary key (name);给name加唯一主键
删主键
alter table xxx drop primary key
加唯一索引
alter table xxx add unique (’column‘)
加全文索引
alter table xxx add fulltext (’column‘)
加普通索引
alter table xxx add index (’column‘)
删除索引
alter table xxx drop index column_name
修改引擎
alter table xxx engine = InniDB
show engine  查看所有引擎
修改自增值
alter table xxx auto_increment=1

数据类型

支持所有标准的sql数据类型

一个字节 范围(-128,127)

类型大小范围(有符号)范围(无符号)用途
TINYINT1字节-128,1270,255
SMALLINT2-32768,327670,
MEDIU3
INT4
BUGINT8-9233372036854755808,9233372036854755807
FLOAT4
DOUBLE8

UNSIGNED 无符号 不能存负数,存储数值大一倍

ZEROFILL:用零补齐 数值前面的位数用零补齐

int(10):是显示十位,不是说只能存十位,可以存很大

字符串类型:

类型大小用途
char0-255定长字符(在字符串中,只有char定长)
varchar0-65535变长字符串
tinyblob0-255不超过255个字节的二进制字符串
tinytext0-255短文本字符串
blob0-65535二进制
text长文本数据
mediumblob
mediumtext比text存储空间大 中等文本
longtext极大文本

日期类型

类型大小(字节)格式区间
dateyyy-mm-dd
timehh:mm:ss
year1
datetime
timestamp时间戳 5.7版本以后41997-01-01 00:00:00

引擎

给数据库至多一直存储的结构和索引方式

MyISAM

读取快,不支持事务,也不支持外建

存成文件:

.frm 存储的表结构信息

MYD 表数据

MYI 索引

InnoDB

健壮的事务型存储引擎

存成文件:

.frm 表定义

ibdata1 数据

.ibd 索引

索引

1,主键索引 一个表只能有一个,值必须是唯一的

2,unique 唯一建 值唯一,但是可以给多个字段

3,普通索引 index

4,文本索引 fulltext 5.7版本以后 在大批量文本中快速的,有序查找内容

5,外建 为了让两个表进行关联

作用:约束

创建外建

在副表中设置
[CONSTRAINT constraint_name]生成名字
FOREIGN KEY (本表cid) REFERENCES xxx+(主表cid)       foreign    references
on delete 动作
on update 动作
动作:no acthion 什么也不做  district 默认  cascade 关联  set null 关联数据改为null
删除外建:alter table stu drop foreign key aaa;
删除键名:alter table stu drop key aaa;

show create table xxx;查看详细表结构

DML:数据操作语言(插入,更新,删除是核心语言)

插入语句

insert into xxx (name) values ()
多行插入
insert into xxx (name) values (1),(2),...
事件:on duplicate key update
insert into xxx (id) values () on duplicate key update id=id+1 以更新的方式防止主键冲突 为了保证程序正常运行
具有select子句的insert
create table aaa like stu;复制stu的表结构,
insert into aaa select * from stu;复制stu的数据给aaa

replace语句

replace into aaa (name) values ()  可以替换主键内容,使程序正常进行 效率比较低 

更新语句

update [low_priority 查询结束在更新][ignore 忽略错误,防止程序停止]xxx set name=dd where id=1
带有select字句的更新
update stu set tname=(select tname from teach order by rand() limit 1);从teach随机取一条更新到stu
关联更新
update xxx,ccc set xxx.name=val,ccc.name=val where xxx.id=1 and ccc.name=原ccc.name
update t1 inner join t2  set t1.name=val,t2.name=val where t1.id=1 and t2.name=原t2.name

随机查询:

select * from order by id asc;正排序查

select * from order by id desc;降排序查

select * from order by id rand();随机排序查

删除语句

delete from xxx where id=1
关联删除
delete xxx,ccc from xxx,ccc where xxx.name='www' abd ccc.name='www'

清空数据

自增的id不保留,效率快
truncate xxx;

日志管理(操作数据库的记录)

错误日志:需要开启 ×

show global variables like 'log_error'  查询错误日志的位置
log_warnings 开启错误开关的全局变量名称  1为开 0为关

一般查询日志:一般不开启 所有操作都记录×

启动开关:general_log
日志文件变量:general_log_file 位置
全局日志开关:log={ON/OFF}

慢查询日志:一般开启 知道哪条查询效率慢×

查询超时时间:long_query_time
启动慢查日志: log_slow_queries={YES|NO}  先不用管
启动慢查日志:slow_query_log
日志记录文件位置:slow_query_log_file

二进制日志:所有引起数据库变化的操作

查看二进制日志
log_bin
开启二进制
log_bin=路经
log_bin 不能改,只能在配置文件改
log_bin=mysql_log_bin
查看
log_bin
datadir 数据目录
%log_bin%

查看所有二进制文件
show binary logs
show master logs
查看当前二进制文件
show msater status
删除某个文件之前的二进制文件
purge binary logs to xxx
清空所有
reset master
自动清理
show variables like "expire_logs_days"  查看默认是几天
set expire_logs_days=7  7天清理一次

中继日志:与主从服务器配合

事务日志:与具体事务配合×

onnerdb_flush_log_at_trx_commit:
a:每秒同步,并执行磁盘flush操作
1:每事务同步,并执行磁盘flush操作
2:每事务同步,但不执行磁盘flush操作

mysql全局变量的查询与修改

查询变量
show global variables [like ‘xxx’] (xxx=port 查端口号)
修改变量
set global name=val
DQL:数据查询语言
select 
字段1,字段2...
from 
table_1
where
group by xxx  分组
having xxx   对组筛选
order by xxx  排序
limit offset,length; 截取

where

select * from xxx where 比较运算符,逻辑运算符,关键字
操作符描述
=
<>或!=不等于
<通常用于数字和日期 CAST(‘1990-10-1’ as DATE) 转化日期 可以进行between
>通常用于数字和日期
>=
<=
or
and并且
not

between

where 字段 [NOT] between 5 AND 10     5-10之间,包括510  CAST('1990-10-1' as DATE) 转化数据进行between

like

select * from xxx where like '%老$%师%' escape '$'        模糊查询   效率不高  %代表可以有多个任意的东西   _ 代表只能有一个任意的东西   escape '$'  定义$为转义字符 $后的字符为普通字符

in

select * from xxx where 字段 in ('1990-10-1',...)   固定的内容

find_in_set()函数

select * from xxx where find_in_set('游泳',字段)   爱好中其中有一项喜欢游泳的
第一个参数:要查找的字符串
第二个参数:字段

group by 分组

select 
c1,c2
from 
table
where
条件
gruop by c1,c2,...(分组条件)
having           分完组后对组再过滤
例子
select shoop.sname,sum(ding.dnum*con.cjia) as 'jia' from shoop,ding,con where shoop.sid=con.sid and con.sid=ding.sid and ding.ddate between cast('2018-10-1' as date) and cast('2018-10-20' as date) group by shoop.sname  通过时间查询一定时间内订单的数量乘以商品单价,返回字段名字与价钱

聚合函数

avg()   计算一组值或表达式的平均值
count()  计算表中的行数
instr()    返回子字符串在字符串中第一次出现的位置
sum()    求总和
min()    最小值
max()    最大值

order by

排序的意思
select 字段1,字段2
from xxx
order by 字段1 [ASC|DESC][升序,降序]
自定义顺序
order by field(gname,'1','2',...)

limit

select * from xxx limit [偏移量(从第几条开始),]长度(取几个)   只有一个值是,代表长度

关联查询 表与表之间 有关系 通过关系查询

交叉连接 cross join  select t1.id,t2.id from t1 cross join t2   叉乘
内连接  inner join   select t1.id,t2.id from t1 inner join t2 on t1.name=t2.name  交集
左连接   left join    select t1.id,t2.id from t1 left join t2 on t1.name=t2.name   左边为准
右连接   right join  select t1.id,t2.id from t1 right join t2 on t1.name=t2.name   右边为准

联合查询 多个select语句查询的结果合并起来

select name from xxx union select cname from ccc
结果的列名总是为第一个查询语句的列名  
默认会自动去除重复项
union all  不会去重

子查询

标量子查询 返回单一值的标量,最简单形式
select * from name where uid=(select uid from user where stu=1)
列子查询 返回结果集是N行一列
select * from name where uid in (select uid from user where stu=1 || stu=2) 等于23全查
select * from name where uid>any(select uid from user where stu=1 || stu=2) 大于其中任何一项
select * from name where uid>all(select uid from user where stu=1 || stu=2) 大于其中所有值
行子查询 返回结果集是一行N列
select * from name where (uid,uname)=(select uid,uname from user where uid=1 and uname='iii')
表子查询 返回结果集是N行N列
select * from name where (uid,uname) in (select uid,uname from user)
select * from xxx where city='hangzhou' and exisit (select * from ccc where cid=1(查询ccc表是否有杭州的id))  把子查询写到exists里,防止表2中没有而报错

常用函数

聚合函数

avg()   计算一组值或表达式的平均值
count()  计算表中的行数
instr()    返回子字符串在字符串中第一次出现的位置
sum()    求总和
min()    最小值
max()    最大值
group_concat()  group by 显示全部分组

字符串函数

concat()  链接  select concat('姓','名') from ccc ...
concat_ws() 加标示  select concat('-','姓','名') from ccc ...-名
left()  从左取   select left(con,3)   只取三个
replace() 替换   replace(str,old_str,new_str)  select replace('aasscc','aa','pp') 把aasscc中的aa换成pp
substring() 截取 substring(str,位置,[长度])  不写长度就是全取
trim()  修剪  trim([both两边|leading前面|trailing后面] 'a' from str) 把哪里(就是中括号里的)的a从str中去掉
format() 格式化函数 format(N,D,[格式 默认en_US])  N 要格式的数字,D保留的小数位

日期和时间函数

返回当前日期函数
curdate()  2018-10-1
now()      2018-10-1 00:00:00  程序执行的这一刻的时间,不变
sysdate()  2018-10-1 00:00:00  系统的时间,一直在运算,实时变化
返回指定日期的函数
day() 获取日
month() 获取月
year() 获取年
week() 获取是今年的地几周
weekdate()  星期几 0-6
dayname()  星期几 返回英文周几   set @@lc_time_names='zh_CN' 写了这个返回中文的周几


日期计算函数

datediff('2018-10-1','2018-11-14') 计算两个时间差几天
timediff(时间或者年月日加时间)   计算差几个小时
timestampdiff(unit,start,end)  unit可以有毫秒,秒,分,时,周,月,季度,年 以unit为单位返回,可以组合用xx_xx
select timestampdiff(year,'1996-8-5',now()); 查年龄
对应:microsecond,second,minute,hour,day,week,month,quarter,year
date_add(start,interval exep unit) 添加时间  interval:关键字
date_sub(start,interval exep unit)  减时间
视图
创建视图
create view xxx as select...
show full table   查看类型
select * from xxx;

修改视图
alter view xxx as select...
create or replace view xxx as select ...
删除视图
drop view ccc.xxx
查看视图
show full tables
查看视图定义
show create view xxx
临时表
时间周期,到数据库关闭  show tables看不出来,不显示
创建临时表
create temporary table xxx select ...
TCL:事务控制语言

事务:完成一件事情的完整的流程

事务性质

原子性:确保了工作单位中的所有操作都成功完成,否则,在失败时会被回滚到事务操作以前的状态
一致性:可确保数据库在正确的更改状态在一个成功提交事务
隔离:使事务相互独立的操作
持久性:确保了提交事务的结果或系统故障情况下仍然存在作用

事务控制语句

begin 或 start transaction 开启一个事务
set autocommit=1开启自动提交
set autocommit=0 禁止自动提交
commit 或 commit work 提交 
rollback 回退,终结事务,如果出错,整个事务全回退
数据库锁

锁:协调多个进程和线程并发访问某一资源的机制,有悲观锁和乐观锁之分

mysql锁:不同的存储引擎支持不同的锁机制 分表锁,行锁,页面锁

查看锁的堵塞情况

表锁:

表锁:有人访问就锁表,并发度低,开销小,运行快,不支持事务,加锁快,不会出现死锁,锁定颗粒度大,发生冲突的概率高,
表级锁的特点:
	共享读锁:都可以访问,但是都不能修改,别人也不能上锁了,加锁的人不能更新和访问其他表
	独占写锁:其他人看都看不到,也不能查询,级别必读锁高,加锁的人不能更新和访问其他表
MySQL里支持表级锁的引擎:MyISAM引擎,MEMORY引擎

如何加表锁:

加锁
Lock table table_name read [local],Lock table table_name write[local]
多表加锁
Lock table table_name [table_name] read [local]
释放锁
Unlock tables
查看表锁争用情况
    show status like 'table%'
    show status like '%lock%'
    show processlist  此命令可以查看那些sql在等待锁
    show open tables 当前被锁住的表以及锁的次数

并发插入

mysql配置项在etc/my.cnf
myisam引擎有一个系统变量concurrent_insert 专门用来控制并发插入,其值为0,1,2,0=>不能并发插入,1=>如果标准没有空洞(表中间没有被删除的行),可以并发插入,2=> 可以并发插入

读写优先级设置

设置写锁的最多次数
    show global variables like 'max_write_lock_count'
    可以修改最大可上写锁次数,次数到了之后会暂停一下,给读操作一个机会
    set global max_writh_lock_count=10
先设置优先级变量打开
    set global low_priority_updates=1
    set global sql_low_priority_updates=1
    在用insert是在into前加上low_priority关键字

设置写内存

max_allowed_packet=1M  限制接受数据包大小,大的插入和更新会被限制,导致失败
net_buffer_length=2k    insert语句缓存值,就是后面的括号  2k到16M
bulk_insert_buffer_size=8M   一次性insert语句插入的大小

如何优化表锁

1,总是允许并发插入,但是需要定时整理数据库碎片,收回因删除而产生的中间空洞
2,根据场景,设置写的优先级
3,根据场景,是否设置写内存

行锁:

引擎:支持InnoDB
行锁:只锁访问的那一行,并发大,拥堵几率小,开销大,运行效率低
    共享锁(S):允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁
    排它锁(X):允许获得排它锁的事务更新数据,阻止其他事务获得相同数据集的共享读锁和排他写锁
    意向共享锁(IS):事务打算给数据行加行共享锁,要先判断能不能上
    意向排它锁(IX):
行锁特点:
    1,innoDB行锁是通过给行锁加索引来实现的,必须加索引,否则,会自动升级为表锁
    2,对于update,insert,delete会自动加排他锁,对于普通的select语句,不会自动加任何锁
    3,设置行锁  set autocommit=0或begin或start trancesaction(和事务一样)
    4,当给一条数据上了排它锁,其他人操作不了,如果其他人在等的时间太长,会自动释放
    5,当给一行数据加了排它锁,其他人对这行数据没有权限,但不影响其他人对其他行的权限
    6,InniDB默认隔离方式下,上了排它锁,也能查,但查到的是旧的数据
    7,如果操作的数据字段没有索引,行锁就会自动升级为表锁
    8,即使字段加了索引,但是使用时类型变了,则索引失效,还是自动加表锁
    9,删除id=2,操作大于1的,另一个人插入id=2,不可以,id=2也被锁起来了,叫间隙锁
    10,间隙锁也会锁定数据中不存在的
加锁
    共享锁:select最后加 lock in share mode
    排它锁:select最后加for update
释放锁:
    commit
    rollback

XIXSIS
X冲突冲突冲突冲突
IX冲突兼容冲突兼容
S冲突冲突兼容兼容
IS冲突兼容兼容兼容

如果一个事务请求的锁模式与当前的锁兼容,innoDB就将请求的锁赋予改事务,反之,如果两者不兼容,该事务就要等待锁释放

查看行锁争用情况

show status like 'innodb_row_lock%'

事务并发的问题

1,脏读:事务A事务B更新的数据,然后B回滚操作,那么A读取到的就是脏数据
2,不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A	多次读取同一数据时,结果 不一致。
3,幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了		一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻	读。

mysql隔离级别

事务隔离级别脏读不可重复读幻读
读未提交(read-uncommitted)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)

查看隔离级别

select @@session.tx_isolation

设置隔离级别

set session transaction isolation level [read uncommitted][REPEATABLE READ ][read committed][serializable]读未提交,可重复读,不可重复读,串行化

可重复读隔离模式

mvcc:多版本并发控制技术--->每一条数据都有多个版本,每次跟新数据时都跟新版本

如何优化行锁:

1,尽量使用较低的隔离级别;尽心设计索引,并尽量使用索引访问数据,
2,选择合理的事务大小,事务尽量小,小失误的冲突几率小
3,给数据加锁时,最好一次性请求够级别的锁,如修改时,之间申请排它锁,不要先共享锁,在排它锁,这样容易死锁
4,尽量用相等条件访问数据,这样可以避免间隙锁对并发插入的影响
5,对一些特定的事务,可以使用表锁来提高处理速度和减少死锁的可能性

1,课程表 id 课程名 老师id

​ 1 python 1

2,老师表 id 老师名 简介id

​ 1 张三 1

3,简介表 id 简介信息

​ 1 张三xxx

查看 带python的老师的完整信息 三种方式 如何建表

主从复制

1,主从复制原理


2,配置

要求
    1,版本一样,要是不一样,主节点要低于从节点
    2,两台服务器的防火墙要关闭
    3,双方数据库用户要具有全程访问的权限(grant all privilenges on *.* to 'root@%' identified by mysql with grant option)
配置
修改主服务器配置文件 window(my.ini) linux(my.cnf) 写到mysqld下面
    #mysql 唯一id
    server-id=1
    #二进制文件,此件必须填,否则不能同步数据
    log-bin = "mysql-bin"
    #指定二进制错误文件
    log-error="mysql-error"
    #需要同步的数据库,如果需要同步多个数据库
    binlog-do-db=uek_demo
    #不需要同步的数据库
    binlog-ignore-db=mysql
授权给从数据库
    grant replication slave on *.* to 'root'@'172.36.36(从服务器地址)' identified by 	'123456'(密码)
    flush privileges;
重启服务器
	sudo /etc/init.d/mysql restart
查看二进制主服务器信息
	show master status
	 grant replication slave on *.* to 'root'@'192.168.6.162' identified by 'lz1022'
从服务器配置 window(my.ini) linux(my.cnf)
	server-id=2
	log-bin="mysql-bin"
	replicate-do-db=uek_demo
	replicate-ignore-db=mysql
重启服务器
	执行sql语句
	change master to 
	master_host="172.000.00",
	master_user="root"
	master_pasword="123456",
	master_log_file="mysql_bin.00005",
	master_log_pos=107;
先在从服务器配置完成,启动从服务器:
	start slave;
查看:show slave status;
数据库优化操作
   1 硬件
    2 系统配置
     3 数据库表结构
      4 sql语句及索引
    从下而上 成本越高,从上而下,效果越高
B树结构
innodb 太长的东西不适合加索引

explain

sql查询执行顺序:where  在group by 在having  在order by 在limit  在from
使用方法
explain  + select语句
复合索引 最好从左到右使用 最佳左前缀

explain分类

id:代表执行顺序
	子查询,id递增,id越大,越先执行
	id一样,就是级别一样,从上到下执行,上面的是表内数据少的
select_type:代表查询类型
    simple 简单
    primary 主键查询
    union 联合查询
    derived 派生表
    。。。
table:一般显示表名,或者派生表名
type:mysql在表中要找到它所需内容的方式
	all<index<range<ref<eq_ref<const<system<NULL
	all:遍历全表以找到匹配的行,并且查找的内容不带索引
	index:index与all区别是index类型只遍历索引树,就是查找有索引的列
	range:只检索给定范围的行,指定范围 加where id<10 不能用 where in 会把所有索引弄没
	ref:表示上述表的链接匹配条件,where id=1 指定具体的值
	eq_ref:唯一索引 
	const:主键关联,主键指定唯一条件
	system:在衍生查询中只有一条数据 select aa.cname from (select cname from course where 	 id=1) as aa
possible_keys:可能用到的索引,复合索引
key:实际用到的索引
key_len:索引在内存的字节,越小越好
ref:表示上述表的链接匹配条件,告诉你指定的条件
row:查到的行数
extra:其他信息
	NULL:空代表效率不太高 
    useing index:使用了索引,代表性能不错  
    useing where:回表查询,性能一般 
    useing temporary:效率也低 select disnct(去重) cname from teach
    impossible where:where条件有问题 select * from where id=1 and id=2; 不会报错
    useing filesort:效率贼低 没有利用索引还要排序 最佳左前缀
    useing join buffer:关联查询出的,在关联查询时,在缓存里还要保存一份 修正 效率不太高,需要优化
    

MySQL优化方法

1,优化工具

1,explain
2,慢查询查看
优化单表思想
    加索引
    调整索引顺序(最佳左前缀)
    删除干扰索引
    调整查询条件
多表优化思想
	小标驱动大表
	left join 给左表加索引,right join 给右表加索引

2,索引优化

1,不能将索引用作表达式的一部分,也不能把索引作为函数的参数,否则索引失效
	select * from xxx where id+1=1
2,索引不要进行类型转化
3,复合索引遵循左前缀策略
4,复合索引不要用or关键字
5,复合索引不要用!=<>,或is null关键字
6,尽量不要和in在一起用
7,及时删除冗余和长期不用的索引
8,使用like是尽量不要用左边的%,会把索引抹杀没有

3,锁层面优化

4,系统优化:主从复制

5,其他优化

1,可以把null改为not null 
2,数据类型尽可能选择小的
3,unsigned 非负号加上,存的可以多一倍
4,没有太大使用必要,不用decimal类型
5,存时间是用timestamp,字节少(4个)
6,大多情况下没有使用枚举类型的必要
7,列不要太多(字段不要多)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值