MySQL 之索引、视图、触发器
来源:SegmentFault
2023-01-28 09:59:24
0浏览
收藏
你在学习数据库相关的知识吗?本文《MySQL 之索引、视图、触发器》,主要介绍的内容就涉及到MySQL、索引、触发器、视图,如果你想提升自己的开发能力,就不要错过这篇文章,大家要知道编程理论基础和实战操作都是不可或缺的哦!
MySQL 之索引、视图、触发器
索引
- 索引的引入
索引是由数据库表中一列或者多列组合而成,其作用是提高对表中数据的查询速度;类似于图书的目录,方便快速定位,寻找指定的内容。
- 索引的优缺点
优点:提高查询数据的速度
缺点:创建和维护索引的时间增加了
- 建立索引的建议
- 一张表建议最多建立 5 个索引
- 建立复合索引优于单值索引(复合索引占用空间小)
- 建立索引的技巧
- 如果是左连接则需要在右表关联字段上建立索引,因为左表是查的全部数据。如果是右连接则需要在左表关联字段上建立索引。
- 尽可能减少 join 语句中的 NestedLoop 的循环总次数。(永远用小结果集驱动大的结果集)
- 优先优化 NestedLoop 的内层循环。
- 保证 join 语句中被驱动表上 join 条件字段已经被索引。
- 当无法保证被驱动表的 join 条件字段被索引且内存资源充足的前提下,不要太吝啬 JoinBuffer 的设置。
- 索引失效的常见原因
- 查询全部列,不会使用到索引(select *)
- 不遵守最佳左前缀法则(如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引的列)
- 在索引列上做任何操作(计算、函数、(自动或手动)类型转换),会导致索引失效而转向全表扫描
- 存储引擎使用了索引中范围条件右边的列,会导致不会使用到索引
- 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少 select *
- mysql 在使用不等于 (!= 或 )的时候无法使用索引会导致全表扫描
- is null,is not null 也无法使用索引
- like 以通配符开头 ('%abc' 或者 '%abc%')mysql 索引失效会变成全表扫描的操作,当百分号写在右边的时候索引不会失效。解决 '%abc%' 索引失效的方法是,在要模糊查询字段上建立索引,使用覆盖索引的方式查询,则索引则不会失效。
- varchar 类型 (字符串)不加单引号索引失效(如果是 InnoDB 存储类型,会导致行锁变表锁)
- 少用 or,用它来连接时索引会失效,即使其中的条件带有索引也不会使用到索引,如果要想使用 or,又想让索引生效,只能将 or 条件中的每一列都加上索引。如果出现 or 的语句中没有一个列加了索引,那么建议使用 union 拼接多个查询语句。
- not in 和 not exist 不会走索引
- 优化口诀
全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效;
like百分写最右,覆盖索引不写*;
不等空值还有or,索引失效要少用。
- 创建索引的前提
索引的效率取决于索引列的值是否为散列,即该列的值如果越互不相同,那么索引效率越高。反过来,如果记录的列存在大量相同的值,例如 gender 列,大约一半的记录值是 M,另一半是 F,因此,对该列创建索引就没有意义。区分度的公式是
-- 创建普通索引 CREATE TABLE t_user1 ( id INT, userName VARCHAR (20), PASSWORD VARCHAR (20), INDEX (userName) ); -- 创建唯一性索引并为索引取别名 CREATE TABLE t_user2 ( id INT, userName VARCHAR (20), PASSWORD VARCHAR (20), UNIQUE INDEX usrn (userName) ); -- 创建多列索引 CREATE TABLE t_user3 ( id INT, userName VARCHAR (20), PASSWORD VARCHAR (20), INDEX index_user_pwd (userName,PASSWORD) );
- 在已有表中创建索引
-- 在已有表中创建普通索引 CREATE INDEX index_userName ON t_user4(userName); -- 在已有表中创建唯一性索引 CREATE UNIQUE INDEX index_userName ON t_user4(userName); -- 在已有表中创建多列索引 CREATE INDEX index_userName_pwd ON t_user4(userName,PASSWORD); // 或者采用下面的方式 ALTER TABLE students ADD INDEX idx_name_score (name, score); -- 使用 ALTER 删除索引 ALTER TABLE t_user5 ADD INDEX index_user(userName)
- 查看索引
show index from table_name\G;
- 删除索引
-- 删除索引 -- DROP INDEX 索引名 ON 表名; DROP INDEX index_user ON t_user5;
- 索引检索原理


- 哪些情况下应该建立索引 ?
- 主键自动建立唯一索引
- 频繁作为查询条件的字段应该创建索引
- 查询中与其它表关联的字段,外键关系建立索引
- 频繁更新的字段不适合创建索引(因为每次更新不单单是更新了记录还会更新索引)
- where 条件里用不到的字段不创建索引
- 单键索引还是组合索引的选择问题?(在高并发下倾向创建组合索引)
- 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
- 查询中统计或者分组字段
- 哪些情况下不要建立索引?
- 表记录太少
- 经常增删改的表
- 数据重复且分布平均的表字段,因此应该只为最经常查询和最经常排序的数据列建立索引。注意:如果某个数据列包含许多重复的内容,为它建立索引就没有太大的实际效果。
视图
- 视图的引入
- 试图是一种虚拟的表,是从数据库中一个或者多个表中导出来的表。
- 数据库中只存放了视图的定义,而并没有存放视图中的数据,这些数据存放在原来的表中。
- 使用视图查询数据时,数据库系统会从原来的表中取出对应的数据。
- 视图的作用
- 使操作简便化;eg:如果一张表中有 100 个字段,需求只需要 20 个字段,那么可以定义一个视图只取出 20 个字段。
- 增加数据的安全性;eg:如果写代码的时候不想要别人知道某些字段,那么可以定义视图,只取出安全系数低的字段
- 提高表的逻辑独立性;
- 创建视图
CREATE [ALGORITHM = {UNDEFIEND | MERGE | TEMPTABLE}] VIEW 视图名 [(属性清单)] AS SELECT 语句 [WITH [CASCADED | LOCAL] CHECK OPTION] -- 创建单表视图 CREATE VIEW v1 AS SELECT userName,password FROM t_user4 -- 创建单表视图并给视图字段取别名 CREATE VIEW v1(u,p) AS SELECT userName,password FROM t_user4 -- 查询视图结果 SELECT * FROM v1 -- 在多表上创建视图 CREATE VIEW v2 AS SELECT bookName.bookTypeName FROM t_book,t_booktype WHERE t_book.bookTypeId = t_booktype.id
触发器
- 触发器的引入
触发器(trigger)是由事件来触发某个操作,这些事件包括 insert 语句、 update 语句和 delete 语句。当数据库系统执行这些事件时,就会激活触发器执行相应的操作。
- 创建与使用触发器
- 创建只有一个执行语句的触发器
CREATE TRIGGER 触发器名 BEFORE | AFTER 触发事件 ON 表名 FOR EACH ROW 执行语句 -- 其中 new 和 old 为过渡变量, new 代表新的数据,old 代表旧的数据 eg: CREATE TRIGGER trig_book AFTER INSERT ON t_book FOR EACH ROW UPDATE t_booktype SET bookNum=bookNum+1 WHERE new.bookTypeId=t_booktype.id -- 执行以下语句之后将会触发触发器 INSERT INTO t_book VALUES(NULL,'php学习',100,'ke',1)
- 创建有多个执行语句的触发器
CREATE TRIGGER 触发器名 BEFORE | AFTER 触发事件 ON 表名 FOR EACH ROW BEGIN 执行语句列表 END -- 其中,因为 mysql 遇到分号(;)之后会认为语句终止(分号前面的语句为执行语句), 因此需要使用 delimiter 来手动定义在 | 符号中间的语句才为执行语句 eg: delimiter | CREATE TRIGGER trig_book2 AFTER DELETE ON t_book FOR EACH ROW BEGIN UPDATE t_booktype SET bookNum=bookNum-1 WHERE old.bookTypeId=t_booktype.id; INSERT INTO t_log VALUES (NULL,NULL,'在book表里删除了一条数据'); DELETE FROM t_test WHERE old.bookTypeId=t_test.id; END | delimiter; -- 执行以下语句之后将会触发触发器 DELETE FROM t_book WHERE id=3;
- 查看触发器
- 直接执行 sql 语句
SHOW TRIGGERS;
- 在系统数据库中 information_schema 库中查看 TRIGGERS 表
- 删除触发器
DROP TRIGGER [触发器名]; eg: DROP TRIGGER trig_book2;
今天关于《MySQL 之索引、视图、触发器》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于mysql的内容请关注golang学习网公众号!
版本声明
本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除

- 上一篇
- AWDPwn 漏洞加固总结

- 下一篇
- mysql 系列(1) - 基础架构
评论列表
-
- 拉长的鲜花
- 这篇技术贴真及时,好细啊,真优秀,已收藏,关注up主了!希望up主能多写数据库相关的文章。
- 2023-02-04 10:00:21
-
- 心灵美的老虎
- 很有用,一直没懂这个问题,但其实工作中常常有遇到...不过今天到这,看完之后很有帮助,总算是懂了,感谢作者大大分享文章内容!
- 2023-02-01 08:49:06
-
- 欣喜的服饰
- 太细致了,收藏了,感谢up主的这篇博文,我会继续支持!
- 2023-01-31 03:00:28
查看更多
最新文章
-
- 数据库 · MySQL | 10小时前 | 索引 数据类型 字符集 存储引擎 CREATETABLE
- MySQL新建表操作指南与建表技巧
- 462浏览 收藏
-
- 数据库 · MySQL | 1个月前 | 条件判断
- CASEWHEN条件判断的嵌套使用详解与实战场景分析
- 469浏览 收藏
-
- 数据库 · MySQL | 1个月前 | java php
- CSV文件批量导入MySQL的性能优化秘籍大揭秘
- 289浏览 收藏
-
- 数据库 · MySQL | 1个月前 |
- GaleraCluster多主集群配置与冲突解决攻略
- 239浏览 收藏
-
- 数据库 · MySQL | 1个月前 | 窗口函数实战
- MySQL窗口函数实战案例深度剖析
- 315浏览 收藏
-
- 数据库 · MySQL | 1个月前 | 自定义函数
- MySQL插件开发入门:自定义函数(UDF)编写指南
- 184浏览 收藏
-
- 数据库 · MySQL | 1个月前 |
- Windows系统MySQL8.0免安装版配置攻略
- 227浏览 收藏
-
- 数据库 · MySQL | 1个月前 | MySQL错误 数据库诊断
- 深度解析错误代码1045/1217/1205的根本原因及解决方案
- 202浏览 收藏
-
- 数据库 · MySQL | 1个月前 | sql注入 编码规范
- 防范SQL注入必备:编码规范与工具推荐指南
- 140浏览 收藏
查看更多
课程推荐
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
查看更多
AI推荐
-
- 笔灵AI生成答辩PPT
- 探索笔灵AI生成答辩PPT的强大功能,快速制作高质量答辩PPT。精准内容提取、多样模板匹配、数据可视化、配套自述稿生成,让您的学术和职场展示更加专业与高效。
- 13次使用
-
- 知网AIGC检测服务系统
- 知网AIGC检测服务系统,专注于检测学术文本中的疑似AI生成内容。依托知网海量高质量文献资源,结合先进的“知识增强AIGC检测技术”,系统能够从语言模式和语义逻辑两方面精准识别AI生成内容,适用于学术研究、教育和企业领域,确保文本的真实性和原创性。
- 22次使用
-
- AIGC检测-Aibiye
- AIbiye官网推出的AIGC检测服务,专注于检测ChatGPT、Gemini、Claude等AIGC工具生成的文本,帮助用户确保论文的原创性和学术规范。支持txt和doc(x)格式,检测范围为论文正文,提供高准确性和便捷的用户体验。
- 30次使用
-
- 易笔AI论文
- 易笔AI论文平台提供自动写作、格式校对、查重检测等功能,支持多种学术领域的论文生成。价格优惠,界面友好,操作简便,适用于学术研究者、学生及论文辅导机构。
- 38次使用
-
- 笔启AI论文写作平台
- 笔启AI论文写作平台提供多类型论文生成服务,支持多语言写作,满足学术研究者、学生和职场人士的需求。平台采用AI 4.0版本,确保论文质量和原创性,并提供查重保障和隐私保护。
- 35次使用
查看更多
相关文章
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- golang 基于 mysql 简单实现分布式读写锁
- 2023-01-07 384浏览
-
- golang cache带索引超时缓存库实战示例
- 2022-12-31 234浏览
-
- 详解如何利用GORM实现MySQL事务
- 2023-01-07 184浏览
-
- Go语言实现操作MySQL的基础知识总结
- 2023-01-23 265浏览