service mysql start|stop|status
mysql -u root -p +输入密码
set password = password("pass");//设置密码
一种数据结构,功能:高效获取数据,同时会指向数据
类型:BTREE,HASH,R-tree,Full-text
BTREE -> B+tree的优化,增加叶子节点横向指针,便于进行一定范围的查找
索引分类:单值索引、唯一索引、复合索引
主键默认存在主键索引
创建索引
create index index_name on 表名(字段名);
查看索引
show index from 表名
删除索引
drop index 索引名 on 表名;
创建视图
create view view_name as select语句
不建议更新视图,因为视图是用来简化查询操作的
删除视图
drop view view_name;
查看视图
show view
事先经过编译并存储在数据库中的一段SQL语句的集合
好处:减少应用程序和数据库之间的交互,提高效率
CREATE PROCEDURE procedure_name([in/out/inout] 参数名 参数类型)
begin
//sql语句集合
end;
delimeter 新分隔符
call procedure_name();
show procedure status;
show create procedure procedure_name;
drop procedure procedure_name;
begin
declare num int default 10;//声明变量,赋予默认值10
select concat("num的值为:",num);
end$//此时$为分隔符
变量赋值
//方案一
set num = num+10;
//方案2 select into
select count(*) into num from city
if search_condition then statement_list
[elseif search_condition then statement_list]...
[else statement_list]
end if;
当有out(输出变量时)
调用
call pro_test(180,@description)$ //@开头的变量表示用户会话变量,当前会话中变量有效,会话结束会释放
select @description$//$为分隔符
//如果变量有两个@开头,为系统变量
方式1:
CASE case_value
WHEN value1 THEN statement_list
[WHEN value1 THEN statement_list]...
[ELSE statement_list]
END CASE;
方式2:
CASE
WHEN search_condition THEN statement_list
[WHEN search_condition THEN statement_list]...
[ELSE statement_list]
END CASE;
while search_condition do
statement_list
end while;
满足条件,退出循环
REPEAT
statement_list
UNTIL search_condition//条件后没有分号
END REPEAT;
退出条件通过LEAVE语句实现
[begin_label:]LOOP
statement_list
//退出语句实例
if n <= 0 then
leave begin_label;
end if;
END LOOP[end_label]
用来存储查询结果集的类型
DECLARE CURSOR_NAME CURSOR FOR select_Statment;
OPEN CURSOR_NAME;
FETCH CURSOR_NAME INTO var_name[,var_name].....
CLOST CURSOR_NAME;
DECLARE has_data int default 1;
DECLEARE EXIT HANDLER FOR NOT FOUND set has_data = 0;//需要写在游标声明之后,功能,在没有找到数据时退出当前程序,同时设置has_data =0
有返回值
CREATE FUNCTION function_name([param type ...])
RETURNS type
BEGIN
END;
select fun1(2);
CREATE TRIGGER trigger_name
before/after insert/update/delete
on TABLE_NAME
[for each row] //行级触发器,mysql只支持行级触发器
BEGIN
trigger_stmt;
END;
new对象记录新增的行对象,old对象记录之前的对象
show triggers;
show triggers\G;//改变显示样式
drop trigger [schema_name.]trigger_name;
存在事务transaction
外键约束
锁机制:行锁(适合高并发)
不支持事务和外键
其优势是访问的速度快
数据存储在内存中,每个MEMORY表对应一个磁盘文件,格式是.frm,该文件中只存储表的结构。
因数据存放在内存中,并且默认使用HASE索引,服务一旦关闭,表中的数据就会丢失。
一组MyISAM表的组合,这些MyISAM表的结构必须结构完全相同,MERGE表本身并没有存储数据,对MERGE表进行操作,实际是去MyISAM表去处理。与视图类似。
查看当前连接各种命令使用
show status like 'Com_______'; //有七个占位符
查看全局各种命令使用
show global status like 'Com_______'; //有七个占位符
查看innodb各种命令使用
show global status like 'Innodb_rows_%';
定位低效执行sql
方案一:慢查询日志
方案二:show processlist//实时查看
用来查看sql语句执行计划
所有表id一样,表从上到下依次加载
id值不同,id越大,加载优先级越高
SIMPLE:简单select查询,不含子查询或UNION
PRIMARY:包含子查询的最外层标识
SUBQUERY:在SELECT或WHERE列表中包含子查询
DERIVED:在FROM列表中包含的子查询
UNION:第二个SELECT出现在UNION之后
UNION RESULT:从UNION表中获取结果的SELECT
NULL:不访问任何表、索引,直接返回数据
system:表只有一行数据,一般不出现
const:表示通过索引一次就找到了,通常根据主键或者唯一索引进行查询
eq_ref:多表关联查询,当关联出的数据只有一条
ref:非唯一性索引扫描,匹配到结果的所有行
range:范围查询,where 之后出现between,>,<,in等操作
index:查询整个索引树
all:遍历全表
可能用到的索引
实际用到的索引
如果为NULL,则没有使用索引
key的长度
长度越短越好
扫描的行数
using filesort:文件排序,效率低
using temporary:使用了临时抱保存中间结果,常用于order by和group by
using index:避免访问数据行,效率不错
查看当前系统是否支持profile工具
select @@have_profiling;
查看当前系统是否开启profile工具
select @@profiling;
在当前会话开启
set profiling= 1;
查看所有操作耗时
show profiles;
查看操作耗时阶段
show profile for query QUERY_ID;
查看所有信息
show profile all for query QUERY_ID;
分析优化器执行计划
第一步:打开trace,设置格式为json,并设置trace最大能够使用的内存大小
SET optimizer_trace="enabled=on",end_markers_in_json=on;
SET optimizer_trace_max_men_size = 1000000;
第二步:执行sql语句
第三步:select * from information_schema.optimizer_trace\G;
全值匹配:对索引中全部列均指定值
最左前缀法则:在复合索引中,查询需要从左到右不能跳过
范围查询右边的列不能使用索引
不要在索引列上进行运算操作,比如substring(),否则索引失效
字符串不加单引号,索引失效
尽可能使用覆盖索引(查询字段在索引结构中已经记录),不用select *, 因为这种情况需要回表查询
使用or,且包含未进入索引的条件字段,则索引失效
用like模糊匹配,百分号加在前面,索引失效,解决方式:用覆盖索引的方式就使用索引了
如果Mysql评估使用索引比全表扫描更慢,则不使用索引
is NULL, is not NULL,有时索引失效,底层会判断走全表扫描还是走索引
in走索引,not in索引失效
show status like 'Handler_read%';
show global status like 'Handler_read%';
使用load data命令
对于InnoDB类型的表
1、建议以主键顺序插入
2、关闭唯一性校验
导入数据前SET UNIQUE_CHECKS=0;
导入数据后 SET UNIQUE_CHECKS=1;
3、手动提交事务
SET AUTOCOMMIT=0;//关闭自动提交
SET AUTOCOMMIT=1;//开启自动提交,等导入数据后
INSERT INTO TB_TEST VALUES(1,"TOMS"),(2."CAT"),(3,"JERRY");
在事务中进行数据插入,数据量过大则分块插入
start transaction;
insert into tb_test values(1,"TOM");
....
commit;
数据有序插入
有两种排序算法:一次扫描算法,两次扫描算法
通过适当增加系统变量sort_buffer_size和max_length_for_sort_data,增大排序区的大小,提高排序的效率
多个字段进行排序,如果一个升序,一个降序,那么还是会用到filesort
多个字段进行排序,排序的顺序需要和索引的顺序保持一致,不然还会用到filesort