Mysql索引、视图、存储过程和函数、触发器、存储引擎(一)


Mysql高级,数据库优化

1、知识点

一、索引

建立索引
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name
[USING index_type]
ON tbl_name(index_col_name,...)
查看索引
show index 1 from table_name;
删除索引
DROP INDEX index_1 name ON tbl_name;

设计原则:mysql

  • 对查询频次较高,且数据量比较大的表创建索引。sql

  • 索引字段的选择,最佳候选列应当从where子句的条件中提取数据库

  • 使用惟一索引,区分度越高,使用索引的效率越高。编程

  • 索引能够有效的提高查询数据的效率,但索引数量不是多多益善,索引越多会引入至关高的维护代价,下降DML操做的效率,增长相应操做的时间消耗。安全

  • 使用短索引,索引建立以后也是使用硬盘来存储的,所以提高索引访问的I/O效率,也能够提高整体的访问效率。服务器

  • 利用最左前缀,N个列组合而成的组合索引,那么至关因而建立了N个索引,若是查询时where子句中使用了组成该索引的前几个字段,那么这条查询SQL能够利用组合索引来提高查询效率。并发

    建立复合索引: CREATE INDEX idx_name_email_status ON tb_seller(NAME,email,STATUS); 就至关于 对name 建立索引 ; 对name , email 建立了索引 ; 对name , email, status 建立了索引 ;ide

二、视图

建立视图
CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
VIEW view_name [(column_list)]
AS select_statement
[WITH [CASCADED | LOCAL] CHECK OPTION]
查看视图
show views;
删除视图
DROP VIEW view_name ;

视图相对于普通的表的优点主要包括如下几项。 **简单:**使用视图的用户彻底不须要关心后面对应的表的结构、关联条件和筛选条件,对用户来讲已是过滤 好的复合条件的结果集。 **安全:**使用视图的用户只能访问他们被容许查询的结果集,对表的权限管理并不能限制到某个行某个列,但 是经过视图就能够简单的实现。 **数据独立:**一旦视图的结构肯定了,能够屏蔽表结构变化对用户的影响,源表增长列对视图没有影响;源表 修改列名,则能够经过修改视图来解决,不会形成对访问者的影响。函数

三、存储过程和函数

存储过程和函数是 事先通过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程和函数能够简化应用开发人员的不少工做,减小数据在数据库和应用服务器之间的传输,对于提升数据处理的效率是有好处的。 存储过程和函数的区别在于函数必须有返回值,而存储过程没有。oop

3.1存储过程

建立存储过程
CREATE PROCEDURE procedure_name ([proc_parameter[,...]])
begin
-- SQL语句
end ;
调用存储过程
call procedure_name() ;
删除存储过程
DROP PROCEDURE [1 IF EXISTS] sp_name ;

存储过程是能够编程的,意味着可使用变量,表达式,控制结构 , 来完成比较复杂的功能。

知识小贴士 DELIMITER 该关键字用来声明SQL语句的分隔符 , 告诉 MySQL 解释器,该段命令是否已经结束了,mysql是否能够执行了。默认状况下,delimiter是分号;。在命令行客户端中,若是有一行命令以分号结束,那么回车后,mysql将会执行该命令。

例子1:
DELIMITER $
CREATE PROCEDURE pro_test5()
BEGIN
declare countnum int;//声明countnum是一个int类型
select count(*) into countnum from city;//复制,也可以使用set countnum=10;
select countnum;
END$
DELIMITER ;


例子2(if条件):
根据定义的身高变量,断定当前身高的所属的身材类型
180 及以上 ----------> 身材高挑
170 - 180 ---------> 标准身材
170 如下 ----------> 通常身材
//in输入out输出

delimiter $
create procedure pro_test5(in height int , out description varchar(100))
begin
if height >= 180 then
set description='身材高挑';
elseif height >= 170 and height < 180 then
set description='标准身材';
else
set description='通常身材';
end if;
end$
delimiter ;

//调用
call pro_test5(168, @description)$
select @description$


例子3(case条件)
给定一个月份, 而后计算出所在的季度
delimiter $
create procedure pro_test9(month int)
begin
declare result varchar(20);
case
when month >= 1 and month <=3 then
set result = '第一季度';
when month >= 4 and month <=6 then
set result = '第二季度';
when month >= 7 and month <=9 then
set result = '第三季度';
when month >= 10 and month <=12 then
set result = '第四季度';
end case;
select concat('您输入的月份为 :', month , ' , 该月份为 : ' , result) as content ;
end$
delimiter ;

知识小贴士 @description : 这种变量要在变量名称前面加上“@”符号,叫作用户会话变量,表明整个会话过程他都是有做用的,这个相似于全局变量同样。 @@global.sort_buffer_size : 这种在变量前加上 "@@" 符号, 叫作 系统变量

三种循环
题目:计算从1加到n的值

例子1(while)
---------------------------------------
while search_condition do
statement_list
end while;
---------------------------------------
delimiter $
create procedure pro_test8(n int)
begin
declare total int default 0;
declare num int default 1;
while num<=n do
set total = total + num;
set num = num + 1;
end while;
select total;
end$
delimiter ;


例子2(repeat)
语法结构
---------------------------------------
REPEAT
statement_list
UNTIL search_condition
END REPEAT;
----------------------------------------
delimiter $
create procedure pro_test10(n int)
begin
declare total int default 0;
repeat
set total = total + n;
set n = n - 1;
until n=0
end repeat;
select total ;
end$
delimiter ;


例子3(loop)
---------------------------------------
[begin_label:] LOOP
statement_list
END LOOP [end_label]
----------------------------------------
退出循环的条件须要使用其余的语句定义,一般可使用 LEAVE 语句实现,leave用来从标注的流程构造中退出,一般和 BEGIN ... END 或者循环一块儿使用。下面是一个使用 LOOP 和 LEAVE 的简单例子 , 退出循环:

delimiter $
CREATE PROCEDURE pro_test11(n int)
BEGIN
declare total int default 0;
ins: LOOP
IF n <= 0 then
leave ins;
END IF;
set total = total + n;
set n = n - 1;
END LOOP ins;
select total;
END$
delimiter ;

3.2存储函数

语法结构
CREATE FUNCTION function_name([param type ... ])
RETURNS type
BEGIN
...
END;

例子:
定义一个存储过程, 请求知足条件的总记录数 ;
delimiter $
create function count_city(countryId int)
returns int
begin
declare cnum int ;
select count(*) into cnum from city where country_id = countryId;
return cnum;
end$
delimiter ;

调用:
select count_city(1);
select count_city(2);

4.触发器

触发器是与表有关的数据库对象,指在 insert/update/delete 以前或以后,触发并执行触发器中定义的SQL语句集 合。触发器的这种特性能够协助应用在数据库端确保数据的完整性 , 日志记录 , 数据校验等操做 。

使用别名 OLD 和 NEW 来引用触发器中发生变化的记录内容,这与其余的数据库是类似的。如今触发器还只支持 行级触发,不支持语句级触发。

语法结构
create trigger trigger_name
before/after insert/update/delete
on tbl_name
[ for each row ] -- 行级触发器
begin
trigger_stmt ;
end;


例子1:
DELIMITER $
create trigger emp_logs_delete_trigger
after delete
on table_name1
for each row
begin
insert into table_name2 (...)
values(...);
end $
DELIMITER ;

2、存储引擎

一、 最经常使用的存储引擎

建立新表时若是不指定存储引擎,那么系统就会使用默认的存储引擎,MySQL5.5以前的默认存储引擎是 MyISAM,5.5以后就改成了InnoDB。另外两种 MEMORY、MERGE , 了解便可。

1.1 InnoDB

是Mysql的默认存储引擎,用于事务处理应用程序,支持外键。若是应用对事务的完整性有比较高的要求,在并发条件下要求数据的一致性,数据操做除了插入和查询以外,还包含不少的更新、删除操做,那么InnoDB存储引擎是比较合适的选择。InnoDB存储引擎除了有效的下降因为删除和更新致使的锁定, 还能够确保事务的完整提交和回滚,对于相似于计费系统或者财务系统等对数据准确性要求比较高的系统,InnoDB是最合适的选择。

具备事务控制
start transaction;
insert into goods_innodb(id,name)values(null,'Meta20');
commit;

1.2MyISAM

MyISAM : 若是应用是以读操做和插入操做为主,只有不多的更新和删除操做,而且对事务的完整性、并发 性要求不是很高,那么选择这个存储引擎是很是合适的。

相关文章
相关标签/搜索