热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysql触发器常用函数_Mysql索引、视图、存储过程和函数、触发器、存储引擎(一)...

Mysql高级,数据库优化一、知识点1、索引创建索引CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name[USING index_ty

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;

设计原则:对查询频次较高,且数据量比较大的表建立索引。

索引字段的选择,最佳候选列应当从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 创建了索引 ;

2、视图创建视图

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 ;

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

3、存储过程和函数存储过程和函数是 事先经过编译并存储在数据库中的一段 SQL 语句的集合,调用存储过程和函数可以简化应用开发人员的很多工作,减少数据在数据库和应用服务器之间的传输,对于提高数据处理的效率是有好处的。 存储过程和函数的区别在于函数必须有返回值,而存储过程没有。

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 

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 = &#8216;第一季度&#8217;;

when month >= 4 and month <=6 then

set result = &#8216;第二季度&#8217;;

when month >= 7 and month <=9 then

set result = &#8216;第三季度&#8217;;

when month >= 10 and month <=12 then

set result = &#8216;第四季度&#8217;;

end case;

select concat(&#8216;您输入的月份为 :&#8217;, month , &#8216; , 该月份为 : &#8216; , result) as content ;

end$

delimiter ;

知识小贴士 @description : 这种变量要在变量名称前面加上“@”符号,叫做用户会话变量,代表整个会话过程他都是有作用的,这个类似于全局变量一样。 @@global.sort_buffer_size : 这种在变量前加上 &#8220;@@&#8221; 符号, 叫做 系统变量三种循环

题目:计算从1加到n的值

例子1(while)

&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;

while search_condition do

statement_list

end while;

&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;

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)

语法结构

&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;

REPEAT

statement_list

UNTIL search_condition

END REPEAT;

&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-

delimiter $

create procedure pro_test10(n int)

begin

declare total int default 0;

repeat

set total = total + n;

set n = n &#8211; 1;

until n=0

end repeat;

select total ;

end$

delimiter ;

例子3(loop)

&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;

[begin_label:] LOOP

statement_list

END LOOP [end_label]

&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-

退出循环的条件需要使用其他的语句定义,通常可以使用 LEAVE 语句实现,leave用来从标注的流程构造中退出,通常和 BEGIN &#8230; 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 &#8211; 1;

END LOOP ins;

select total;

END$

delimiter ;

3.2存储函数语法结构

CREATE FUNCTION function_name([param type &#8230; ])

RETURNS type

BEGIN

&#8230;

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 ] &#8212; 行级触发器

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 (&#8230;)

values(&#8230;);

end $

DELIMITER ;

二、存储引擎

1、 最常用的存储引擎

创建新表时如果不指定存储引擎,那么系统就会使用默认的存储引擎,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,&#8217;Meta20&#8242;);

commit;

1.2MyISAM

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


推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • qt学习(六)数据库注册用户的实现方法
    本文介绍了在qt学习中实现数据库注册用户的方法,包括登录按钮按下后出现注册页面、账号可用性判断、密码格式判断、邮箱格式判断等步骤。具体实现过程包括UI设计、数据库的创建和各个模块调用数据内容。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
author-avatar
纠结丿灬情殇
这个家伙很懒,什么也没留下!
RankList | 热门文章