day21 单列索引与组合索引 & 索引的优点和使用原则 & 视图与函数
索引
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查询出来的结果集
视图不是真正的表,它只是按照封装的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;
day21 单列索引与组合索引 & 索引的优点和使用原则 & 视图与函数的更多相关文章
- MySQL单列索引和组合索引的区别介绍
MySQL单列索引和组合索引的区别介绍 作者:佚名出处:IT专家网2010-11-22 13:05 MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有 ...
- [转]MySQL单列索引和组合索引的区别介绍
FROM : http://database.ctocio.com.cn/353/11664853.shtml MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引 ...
- MySQL单列索引和组合索引(联合索引)的区别详解
发现index merge局限性,优化器会自动判断是否使用 index merge 优化技术,查询还是需要组合索引[推荐阅读:对mysql使用索引的误解] MySQL单列索引和组合索引(联合索引)的区 ...
- MySQL单列索引和组合索引的选择效率与explain分析
一.先阐述下单列索引和组合索引的概念: 单列索引:即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引. 组合索引:即一个索包含多个列. 如果我们的查询where条件只有一个,我们完全可 ...
- MySQL单列索引和组合索引的区别介绍(转)
原文:http://database.51cto.com/art/201011/233234.htm MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能 ...
- MySQL单列索引和组合索引的创建及区别介绍
MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解,下面就为您分析两者的主要区别,供您参考学习. 为了形象地对比两者,再建一个表 ...
- 认识SQLServer索引以及单列索引和多列索引的不同
一.索引的概念 索引的用途:我们对数据查询及处理速度已成为衡量应用系统成败的标准,而采用索引来加快数据处理速度通常是最普遍采用的优化方法. 索引是什么:数据库中的索引类似于一本书的目录,在一本书中使 ...
- mysql索引之组合索引
多列索引又称组合索引,在mysql的查询操作中,我们经常会遇到多个搜索条件,如:$sql = "select * from article where content='ma4' and t ...
- Atitit. 单列索引与多列索引 多个条件的查询原理与设计实现
Atitit. 单列索引与多列索引 多个条件的查询原理与设计实现 1. MySQL只能使用一个索引1 1.1. 最左前缀1 1.2. 从另一方面理解,它相当于我们创建了(firstname,last ...
- MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划
这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...
随机推荐
- Skype for Business server 数据库安装
之前安装了SFB 2015标准版,但是没有安装归档据库,现在打算重新安装.环境中安装的是默认自带的SQL EXPRESS. 继续安装向导,安装SQL数据库.但是在最后的时候遇到了问题. 安装向导报错 ...
- 继GitHub的Copilot收费后,亚马逊推出了 CodeWhisperer,感觉不错哟!
Copilot 是 Github 推出的一款人工智能编程助手,推出仅一年就受到大量开发者的追捧(据官方统计有 120 万用户).然而,自 2022 年 6 月起,它改为了付费订阅模式(每月 10 美元 ...
- Dockerfile中ADD命令详细解读
ADD指令的功能是将主机构建环境(上下文)目录中的文件和目录.以及一个URL标记的文件 拷贝到镜像中. 其格式是: ADD 源路径 目标路径 #test FROM ubuntu MAINTAINER ...
- 启动elasticsearch报错解决
说不定以后会不定期更新该文档 1.提示文件描述符数量太少,修改/etc/security/limits.conf文件,添加. * soft nofile 65537 * hard nofile 655 ...
- 使用Prometheus和Grafana监控nacos集群
官方文档:https://nacos.io/zh-cn/docs/monitor-guide.html 按照部署文档搭建好Nacos集群 配置application.properties文件,暴露me ...
- ToroiseGit/GitBash 设置提交信息模板设置
一.背景:当使用git提交代码时,每次的提交信息固定,却又比较长不好记的时,还需要将模板的地址保存下来,如果能设置一个固定的模板就可以很好的解决这个问题. 提交前的提交信息需要手动输入: 二.Toro ...
- 洛谷P3381 (最小费用最大流模板)
记得把数组开大一点,不然就RE了... 1 #include<bits/stdc++.h> 2 using namespace std; 3 #define int long long 4 ...
- KubeEdge SIG AI发布首个分布式协同AI Benchmark调研
摘要:AI Benchmark旨在衡量AI模型的性能和效能. 本文分享自华为云社区<KubeEdge SIG AI发布首个分布式协同AI Benchmark调研>,作者:KubeEdge ...
- 【算法训练营day8】LeetCode344. 反转字符串 LeetCode541. 反转字符串II 剑指Offer05. 替换空格 LeetCode151. 翻转字符串里的单词 剑指Offer58-II. 左旋转字符串
[算法训练营day8]LeetCode344. 反转字符串 LeetCode541. 反转字符串II 剑指Offer05. 替换空格 LeetCode151. 翻转字符串里的单词 剑指Offer58- ...
- 编写一个jsp页面,利用Scriptlet编写一段计算代码,要求用零作为除数,并使用page指令将错误信息显示在另外一个jsp页面,产生的错误信息为“错误,不能用0做除数”
文章目录 1.测试结果: 2.结果计算页面 3.错误处理页面 1.测试结果: 2.结果计算页面 <%@ page language="java" contentType=&q ...