首页 > 其他分享 >day21 单列索引与组合索引 & 索引的优点和使用原则 & 视图与函数

day21 单列索引与组合索引 & 索引的优点和使用原则 & 视图与函数

时间:2022-10-28 16:14:08浏览次数:70  
标签:END -- res day21 视图 索引 RETURN

索引

1.索引有几种
四种,单列索引,组合索引,全文索引,空间索引
2.索引的优点
所有的MySQL数据库列类型都可以被索引,也就是可以给任意字段加索引
提高数据查询速度

索引的缺点
1)创建索引和维护索引需要耗费时间,并且随着数据量的增加所耗费的时间也会增加
2.索引占空间,如果有大量的索引,索引文件可能比数据文件更快达到上限值
3.当对表中的数据进行增删改时,索引也需要动态的维护,降低了数据的维护速度
3.索引的触发原则
最左前缀原则

最左前缀原则:
组合索引就是遵从了最左前缀,利用索引中最左边的字段来进行匹配,这样的字段称为最左前缀
1.只有where的情况,遵从最左原则,条件必须有最左边的字段,才会用到索引,中间如果断开了,则都不会用到后面的索引

2.group by和order by 一样,也是遵从最左原则,可以看作继承where的条件顺序,但需要where作为基础铺垫,若没有where语句,单纯的这两个也是不会使用任何索引

注意:
使用范围条件时,也会使用到该处的索引,但是后面的索引都不会用到

4.索引的使用原则

1)并不是每个字段都设置索引就好,也不是索引越多越好
2)对更新频繁的表要避免进行过多的索引,对查询频繁的字段应该适当创建索引
3)数据量小的表最好不要用索引,因为可能遍历索引的时间比查询所有的数据花费的时间都多,索引就不会产生优化效果
4)重复值较多的列上不要建立索引,重复值较少的列上要建立索引
索引使用原则的总结:
表数据量大(>50w),查询频繁(QPS>1000)的情况下,可以不同值较多的列建立索引
QPS 每秒查询率,单位时间内的查询速率 1000/s

数据库优化
1.查询频繁的表,建索引,分库
2.更新频繁的表,分表分库

定义

用于快速找出在某一列中具有一特定值的行
索引用于快速定位包含目标条件的行

不使用索引 MySQL默认的检索规则是从第一行开始读完整张表,表越大,查询时间越长

分类

单列索引

普通索引 key key_name(column_name)
MySQL中的基本索引,没有什么限制;
允许在定义索引的列中插入重复值和空值纯粹是为了查数据更快一点
添加索引

	alter table table_name
	add index index_name(column)

唯一索引 unique key key_name(column)
索引中的值必须是唯一的,并且允许有空值null;
添加索引
alter table table_name
add unique index_name(column)
主键索引 primary key key_name()
一种特殊的唯一索引,不允许有空值

组合索引

key keyname(column1,column2...)

1.在表中多个字段组合上创建索引
2.只有查询条件中使用了字段组合的最左边字段时,索引才会被触发
3.使用组合索引时遵循最左前缀原则

最左前缀原则:
组合索引就是遵从了最左前缀,利用索引中最左边的字段来进行匹配,这样的字段称为最左前缀
1.只有where的情况,遵从最左原则,条件必须有最左边的字段,才会用到索引,中间如果断开了,则都不会用到后面的索引

2.group by和order by 一样,也是遵从最左原则,可以看作继承where的条件顺序,但需要where作为基础铺垫,若没有where语句,单纯的这两个也是不会使用任何索引

注意:
使用范围条件时,也会使用到该处的索引,但是后面的索引都不会用到

全文索引fulltext key()

全文索引,只在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT三种字段类型上才能使用全文索引

空间索引

空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有四种,GEOMETRY,POINT,LINESTRING,POLYGON
在创建空间索引时,使用SPATIAL关键字,要求,引擎为MyISAM,创建空间索引的列,必须将其声明名NOT NULL

视图view

定义

视图不是临时表,视图就是封装的复杂的sql语句,目的就是为了方便执行复杂sql

类似一张虚拟的表,视图不是真正存在的表,只是按照封装的sql查询出来的结果集

类似Java封装好的方法,可以直接调用

创建视图

1)新建视图
2)在视图内创建select语句
3)保存命名v_xxx
4)在查询中用 select*from v_xxx调用

函数FUNCTION

1.函数与java中的方法一样,有入参,有且只有一个返回值
2.函数的返回值,只能是一个值,不能是结果集

. #DETEMINISTIC 关键字表示,在入参不变的情况下,多次调用函数,返回值不会发生改变

创建函数

//这个函数是root`@`localhost创建的,名字是f_demo,**注意** sql语句中变量要写在数据类型前面
CREATE DEFINER=`root`@`localhost` FUNCTION `f_demo`(a int, b int) RETURNS int
    DETERMINISTIC
BEGIN
	RETURN a+b;
END

变量

普通变量

声明变量 DECLARE声明变量关键字
declare no int default 0;
DECLARE 变量名 数据类型 默认值;

set关键字赋值
set no = 2;

会话变量

会话变量声明:变量前加一个@,无序单独声明,可以直接赋值

set @c = a + b;//直接接收a+b的结果,不需要声明c的数据类型
set @c = 12;

分支与循环

if语句

IF 判断条件 THEN 结果或结果集;
ELSEIF 判断条件 THEN 结果或结果集;
ELSE 结果或结果集;
END IF;

//函数内
BEGIN
# 声明普通变量
-- 	DECLARE c INT;
#给变量c赋值
-- 	SET c = a + b;

#声明会话变量
-- 没有声明数据类型,直接接收值
-- 	set @c = a + b;
	
	
	DECLARE res VARCHAR(55);
	
	IF str = "yes" THEN 
-- 		RETURN "是的";
		SET res = "是的";
	ELSEIF str = "no" THEN
-- 		RETURN "不是";
		SET res = "不是";
	ELSE 
-- 	RETURN "???";
		SET res = "???";
	END IF;

	RETURN res;
END

while循环

WHILE 条件 DO
执行sql。。。
END WHILE;

//函数内
BEGIN
# 声明普通变量
-- 	DECLARE c INT;
#给变量c赋值
-- 	SET c = a + b;

#声明会话变量
-- 没有声明数据类型,直接接收值
-- 	set @c = a + b;
	
	
	DECLARE res VARCHAR(55);
	
	IF str = "yes" THEN 
-- 		RETURN "是的";
		SET res = "是的";
	ELSEIF str = "no" THEN
-- 		RETURN "不是";
		SET res = "不是";
	ELSE 
-- 	RETURN "???";
		SET res = "???";
	END IF;

	RETURN res;
END

case语句 case when

相当于switch

case 字段
when 判断值 then 结果或结果集;
when 判断值 then 结果或结果集;
when 判断值 then 结果或结果集;
when 判断值 then 结果或结果集;
else 结果或结果集;
END;

//查询内
SELECT *,
CASE s_sex 
WHEN 1 THEN "男" 
WHEN 0 THEN "女" 
END AS real_sex
FROM student;


SELECT *,CASE  WHEN s_sex=1 THEN "男" WHEN s_sex= 0 THEN "女" END AS real_sex FROM student;

标签:END,--,res,day21,视图,索引,RETURN
From: https://www.cnblogs.com/xiaoto9426/p/16834859.html

相关文章

  • like模糊匹配查询慢解决之道——MySQL全文索引
    需求需要模糊匹配查询一个单词select*fromt_phrasewhereLOCATE('昌',phrase)=0;select*fromt_chinese_phrasewhereinstr(phrase,'昌')>0;select*......
  • vue数据值变了,但是input视图没有更新怎么办?
    直接给对象的属性赋值,并不能使得视图发生变化,此时我们可以用vue的$set方法来赋值解决这个问题this.$set(对象,'属性名','属性值')使用这段代码给对象赋值this.$set......
  • MySQL索引以及InnoDB
    二叉树当数据是自增的时候,二叉树会跟链表没有区别平衡二叉树它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。这个方案很......
  • 前后端分离项目(七):实现"添加用户"功能(前端视图)
    好家伙, 我们要实现"注册添加用户"功能老样子我们先来理清一下思路,现在,我是一个用户,我来到了注册页面,然后,我要把老样子,我们先去饿了么偷点东西   拿个......
  • 力扣(leetcode) 852. 山脉数组的峰顶索引(一行代码解决)(二分法)
    题目在这:​​https://leetcode-cn.com/problems/peak-index-in-a-mountain-array/​​题目分析:题目一堆数学符号看着难受。给大家解答一下,就是给了一堆数组,其中有一个数X......
  • day21.内容回顾及总结
    前端体系结构及知识点一阶段(html+css)基础的页面布局(div弹性盒子布局)seo优化(搜索引擎优化)动画效果html5和css3多端适配(rem)二阶......
  • 「MySQL高级篇」explain分析SQL,索引失效&&常见优化场景
    大家好,我是melo,一名大三后台练习生专栏回顾索引的原理&&设计原则欢迎关注本专栏:MySQL高级篇本篇速览在我们上一篇文章中,讲到了索引的原理&&设计原则,知道了索引如......
  • 060_索引及文档基本操作
    目录基本Rest命令关于索引的基本操作创建索引及文档创建索引,指定字段类型查询索引创建索引及文档查询索引及文档默认的信息扩展命令修改索引PUT覆盖POST修改删除索引关于文......
  • 090_索引和文档的API操作
    目录注入RestHighLevelClient关于索引的API操作创建索引判断索引是否存在删除索引关于文档的API操作创建实体类添加文档判断文档是否存在获取文档更新文档删除文档大批量文......
  • MySQL组合索引(a,b,c)和EXPLAIN的使用
    前言MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。而索引可分单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多......