【mysql】mysql之索引学习

news2024/11/13 8:52:24

  本站以分享各种运维经验和运维所需要的技能为主

《python零基础入门》:python零基础入门学习

《python运维脚本》: python运维脚本实践

《shell》:shell学习

《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战

《k8》从问题中去学习k8s

《docker学习》暂未更新

《ceph学习》ceph日常问题解决分享

《日志收集》ELK+各种中间件

《运维日常》运维日常

《linux》运维面试100问

《DBA》db的介绍使用(mysql、redis、mongodb...)

一. 索引

1.什么是索引

1.索引就好比一本书的目录,它能让你更快的找到自己想要的内容。
2.让获取的数据更有目的性,从而提高数据库检索数据的性能。
​
# 注意: 在创建表时为字段创建索引,如不指定索引名称,默认会将字段名作为索引名称。
desc select * from 库名 where 判断语句      # 可看出此语句是否走索引。

2.索引的种类

1.BTREE: B+树索引(Btree,B+tree,B*tree)
2.HASH:HASH索引(memery存储引擎支持)
3.FULLTEXT:全文索引(myisam存储引擎支持)
4.RTREE:R树索引

# 总结:
      常用为b+树索引,对b+树的分类为Btree B+tree B*tree
      三者区别:
            Btree: 走根节点,枝节点,叶子节点,三个节点没有分支
            B+tree: 走根节点,枝节点,叶子节点,在叶子节点有做优化,比Btree好
            B*tree: 走根节点,枝节点,叶子节点,在枝节点有做优化,比B+tree和Btree好
1)Btree索引

img

2)B+tree索引

img

3)B*tree索引

img

3索引根据算法分类

索引是建立在数据库字段上面的
当where条件后面接的内容有索引的时候,会提高速度
1)主键索引(聚集索引)
#创建表的时候创建主键索引
mysql> create table test(id int not null auto_increment primary key comment '学号');
Query OK, 0 rows affected (0.04 sec)
​
mysql> create table test1(id int not null auto_increment,primary key(id));
Query OK, 0 rows affected (0.04 sec)
​
#查看索引命令
mysql> show index from test;
​
#已经有表时添加主键索引
mysql> alter table student add primary key pri_id(id);
2)唯一键索引
#创建表的时候创建唯一键索引
mysql> create table test2(id int not null auto_increment unique key comment '学号');
Query OK, 0 rows affected (0.04 sec)
​
#已经有表时添加唯一键索引
mysql> alter table student add unique key uni_key(name);
#注意:创建唯一建索引或主键索引的列不能有重复数据
判断一列能否做唯一建索引
1.查询数据总量
mysql> select count(name) from city;
2.去重查看该列数据总量
mysql> select count(distinct(name)) from city;
​
#以上两个值相等则可以设置唯一建索引
#1.查看列的总数据量
mysql> select count(name) from country;
+-------------+
| count(name) |
+-------------+
|         239 |
+-------------+
1 row in set (0.00 sec)
#2.查看去重后数据量
mysql> select count(distinct(name)) from country;
+-----------------------+
| count(distinct(name)) |
+-----------------------+
|                   239 |
+-----------------------+
1 row in set (0.00 sec)
#3.创建唯一建索引
mysql> alter table country add unique key uni_key(name);
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0
3)普通索引(辅助索引)
mysql> alter table city add index inx_name(name);
Query OK, 0 rows affected (0.14 sec)
Records: 0  Duplicates: 0  Warnings: 0
​
mysql> create index index_District on city(District);
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0
4)全文索引
mysql> create table txt(id int,bookname varchar(12),wenzhang text,fulltext(wenzhang));
Query OK, 0 rows affected (0.20 sec)
​
mysql> select * from txt where match(wenzhang) against('查询的内容');
​
#实例
mysql> create table text(id int,bookname varchar(12) charset utf8,wenzhang text charset utf8,fulltext(wenzhang));
Query OK, 0 rows affected (0.21 sec)
​
mysql> insert into text values(1,'红楼梦','上回书说到张飞长坂坡三打白骨精救出宋江');
Query OK, 1 row affected (0.01 sec)
​
mysql> select * from text;
+------+-----------+-----------------------------------------------------------+
| id   | bookname  | wenzhang                                                  |
+------+-----------+-----------------------------------------------------------+
|    1 | 红楼梦    | 上回书说到张飞长坂坡三打白骨精救出宋江                    |
+------+-----------+-----------------------------------------------------------+
1 row in set (0.00 sec)
​
mysql> select * from text where match(wenzhang) against('上回书说到张飞长坂坡三打白骨精救出宋江');
+------+-----------+-----------------------------------------------------------+
| id   | bookname  | wenzhang                                                  |
+------+-----------+-----------------------------------------------------------+
|    1 | 红楼梦    | 上回书说到张飞长坂坡三打白骨精救出宋江                    |
+------+-----------+-----------------------------------------------------------+
1 row in set (0.00 sec)
5)查看索引
#方式一:
mysql> show index from city;
​
#方式二:
mysql> desc city;
+-----+
| Key |
+-----+
| PRI |   #主键索引
| MUL |   #普通索引
| UNI |   #唯一键索引
| MUL |
+-----+
6)删除索引
mysql> alter table city drop index index_District;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

4索引根据配置方法分类

7)联合索引
# 注意:
联合索引在查询时不能用> < 符号,要用等于号,否则联合查询中,多个判断语句,只会将第一个查询走索引,后面直接不走索引。如图一则不走索引,但可将> 查询放到k1=5g后面
​
# 创建联合索引:
联合索引是在多个列上创建的,多个字段建立一个索引,原则:把最常用来做为条件查询的列放在最前面
#创建people表
create table xiangqin( id, name varchar(10), age int, money bigint, body varchar(10), hight int, weight int, face varchar(10), phone varchar(11), sex enum('f','m')); 
#创建联合索引 
mysql> alter table xiangqin add index idx_all(sex,money,body,face); 
insert into xiangqin values('ly',30,999999999,'perfact',158,90,'nice','133','f'), ('qbl',58,1000000,'bad',150,150,'very bad','000','f'), ('wbq',50,9999999,'suibian',170,120,'suiyi',132,'m');
#查询 
走索引
mysql> select * from xiangqin where sex='f' and money>10000000 and body='perfact' and face='nice'; 
不走索引
mysql> select * from xiangqin where money>10000000 and body='perfact' and face='nice'; mysql> select * from xiangqin where money>10000000 and body='perfact' and face='nice' and sex='f'; 
​
# 简单案例:
mysql> create database xiangqing;
​
mysql> create table xiangqin(id int,name varchar(20),gender enum('m','f'),age tinyint,money int,height int,weight int,looks tinyint);
​
mysql> insert xiangqin values(1,'qiudao','m',38,-200000,120,130,'10'),(2,'dilireba','f',18,400000,180,100,'60'),(3,'cxk','m',28,100000,170,120,'440'),(4,'fbb','f',18,1000000,165,85,'90');
​
#创建联合索引
mysql> alter table xiangqin add index lh_key(money,gender,age,looks);
​
#联合索引使用三种情况
1.部分走索引   money,gender,age
2.全部走索引   money,gender,age,looks
3.不走索引     gender,age

· 图一:

img

8)前缀索引
# 概括:
根据字段的前N个字符建立索引
# 注意:
1. 前缀索引只能应用到字符串上的列
2.避免对大列 建索引
3.如果有,就使用前缀索引
# 使用:
alter table city add index idx_name(name(5));      #选择name这一列从左到右的前5个字符作为前缀索引

二、explain的使用

1.explain语法

explain + DQL语句
​
mysql> explain select * from city where countrycode ='CHN' or countrycode ='USA';
​
#查询中国和美国的数据
mysql> select * from city where countrycode ='CHN' or countrycode ='USA';
mysql> select * from city where countrycode in ('CHN','USA');
mysql> select * from city where countrycode = 'CHN' union all select * from city where countrycode = 'USA';
​
Extra(扩展)
  Using temporary 使用group by大概率出现
  Using filesort 使用了order by大概率出现
  Using join buffer 使用join on大概率出现

2.扩展group by

#一般与聚合索引一起使用
​
#建表
mysql> create table jixiao(id int,name varchar(20) charset utf8,jixiao int,product varchar(10) charset utf8);                                    
Query OK, 0 rows affected (0.03 sec)
#插入数据
mysql> insert jixiao values(1,'qiudao','1000000','房地产'),(2,'niulei','10000','房地产'),(3,'lijianpeng','100000','汽车'),(4,'qiandao','200000',' 汽车');
#查询不同行业绩效最高的人
mysql> select name,sum(jixiao),product from jixiao group by product;
+------------+-------------+-----------+
| name       | sum(jixiao) | product   |
+------------+-------------+-----------+
| qiudao     |     1010000 | 房地产    |
| lijianpeng |      300000 | 汽车      |
+------------+-------------+-----------+
2 rows in set (0.00 sec)
#查询房地产行业绩效最高的人
mysql> select name,sum(jixiao),product from jixiao group by product having product='房地产';
+--------+-------------+-----------+
| name   | sum(jixiao) | product   |
+--------+-------------+-----------+
| qiudao |     1010000 | 房地产    |
+--------+-------------+-----------+
1 row in set (0.00 sec)

3.查询数据的方式

1)全表扫描
#1.什么是全表扫描
查询数据时type类型为ALL
​
#2.什么情况全表扫描
1)查询数据库所有数据
  mysql> explain select * from country
2)没有走索引
  没设置索引
  索引损坏
2)索引扫描type
# 注意: 此处优先级从上往下对应从低到高,一般企业中需要达到语句查询类型为range
​
1.index     #全索引扫描
  mysql> explain select Name from city;
​
2.range     #范围查询
  mysql> explain select * from city where countrycode ='CHN' or countrycode ='USA';
  #有限制查询到的数据在总数据的20%以内,超过则走全文扫描,所以在查询是可以使用limit限制
  mysql> explain select * from city where countrycode != 'CHN' limit 500;
​
3.ref     #精确查询
  mysql> explain select * from city where countrycode ='CHN';
​
4.eq_ref    #使用join on时偶尔会出现
​
5.const     #查询条件是唯一索引或主键索引
  mysql> explain select * from city where id=1;
​
6.system    #查询级别与const一样,当数据很少时为该级别
​
7.null      #不需要读取数据,只需要获取最大值或者最小值
  mysql> explain select max(population) from city;

三、索引的建立

1.索引的建立原则

1.能创建唯一索引就创建唯一索引
​
2.为经常需要排序、分组和联合操作的字段建立索引
​
3.为常作为查询条件的字段建立索引
  如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。
  因此,为这样的字段建立索引,可以提高整个表的查询速度。
  
4.尽量使用前缀来索引
  如果索引字段的值很长,最好使用值的前缀来索引。
    例如,TEXT和BLOG类型的字段,进行全文检索,会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。
    
5.限制索引的数目
  索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。
  修改表时,对索引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间。
​
6.删除不再使用或者很少使用的索引
  表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。

2.总结什么时候不走索引

1)没有查询条件,或者查询条件没有索引
#没有查询条件
mysql> explain select * from city;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | city  | ALL  | NULL          | NULL | NULL    | NULL | 4188 | NULL  |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)
​
#查询条件没有索引
mysql> explain select District from city;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | city  | ALL  | NULL          | NULL | NULL    | NULL | 4188 | NULL  |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)
2)查询的结果占总数据的20%左右
#占总数据的18%,没走索引
mysql> explain select * from city where population > 400000;
​
#占总数据的15%,走了索引
mysql> explain select * from city where population > 450000;
​
#如果数据量查询就是表中大部分数据,可以用limit做限制
mysql> explain select * from city where population > 400000 limit 100;
3)索引损坏
4)查询条件带了特使符号(+,-)
#在=号左侧有特殊符号,不走索引
mysql> explain select * from city where id-1=1;
​
#在=号右侧有特殊符号,走索引
mysql> explain select * from city where id=3-1;
5)隐式转换
# 什么叫做隐式转换:
· 举个例子,当字段类型为字符串(varchar)时,但在插入数据时值为数字,也就是整数。则字段类型和值不匹配,就叫做隐式转换。

#建表
mysql> create table test (id int ,name varchar(20),telnum varchar(10));
Query OK, 0 rows affected (0.04 sec)
#插入数据
mysql> insert into test values(1,'zs','110'),(2,'l4',120),(3,'w5',119),(4,'z4',112);
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0
#建立索引
mysql> desc phonenum;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(10) | YES  |     | NULL    |       |
| phone | varchar(10) | YES  | UNI | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
#查询语句级别全文扫描(phone字段类型为字符串,需要用引号,如不尊重它的规则,则不给你走索引)
mysql> explain select * from phonenum where phone=6666666;
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table    | type | possible_keys | key  | key_len | ref  | rows | Extra       |
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
|  1 | SIMPLE      | phonenum | ALL  | uni_key       | NULL | NULL    | NULL |    3 | Using where |
+----+-------------+----------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)
#当给字符加上引号,查询为索引扫描
mysql> explain select * from phonenum where phone='6666666';
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table    | type  | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | phonenum | const | uni_key       | uni_key | 13      | const |    1 | NULL  |
+----+-------------+----------+-------+---------------+---------+---------+-------+------+-------+
1 row in set (0.00 sec)
6)like "%_" 百分号在最前面不走
7)联合索引查询不按照顺序有可能不走索引

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2079582.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试搜狐大型模型算法工程师,感受非凡体验!

搜狐大模型算法工程师面试题 应聘岗位&#xff1a;搜狐大模型算法工程师 面试轮数&#xff1a; 整体面试感觉&#xff1a;偏简单 面试过程回顾 1. 自我介绍 在自我介绍环节&#xff0c;我清晰地阐述了个人基本信息、教育背景、工作经历和技能特长&#xff0c;展示了自信和沟通…

【Office】激活文件无法打开-DragonKMS--解决办法

【解决办法】右键 文件属性>>最下面勾选解除锁定即可打开。 【原因】&#xff1a;网络上下载的文件&#xff08;包括exe、zip等&#xff09;。

vue.js3+element-plus+typescript add,edit,del,search

vite.config.ts server: {cors: true, // 默认启用并允许任何源host: 0.0.0.0, // 这个用于启动port: 5110, // 指定启动端口open: true, //启动后是否自动打开浏览器 proxy: {/api: {target: http://localhost:8081/, //实际请求地址&#xff0c;数据库的rest APIschangeOr…

esp32 控制 st7735s 显示屏(spi)

Lcd初始化后全屏为花屏&#xff0c;必须再把整个屏幕转成全底白色消除花屏后再显示图片&#xff0c;字符。 我理解为什么是花屏&#xff0c;因为只是初始化各个参数&#xff0c;显示内存现在还是为空&#xff0c;还没有执行0x2c命令。 图片 #include "driver/spi_master…

统一 transformer 与 diffusion !Meta 融合新方法剑指下一代多模态王者

本文引入了 Transfusion&#xff0c;这是一种可以在离散和连续数据上训练多模态模型的方法。 来源丨机器之心 一般来说&#xff0c;多模态生成模型需要能够感知、处理和生成离散元素&#xff08;如文本或代码&#xff09;和连续元素&#xff08;如图像、音频和视频数据&#xf…

软件测试-Selenium+python自动化测试

目录 一、元素定位 1.1一个简单的模板 1.2单选框radio定位实战 1.3下拉操作 1.4弹窗 1.5文件上传 1.6 iframe(类似于页中页,嵌套进去了) 二、元素定位实战 会用到谷歌浏览器Chrome测试,需要下载一个Chromedriver(Chrome for Testing availability)对应自己的浏览…

力扣面试经典算法150题:除自身以外数组的乘积

除自身以外数组的乘积算法详解 今天的题目是力扣面试经典150题中的数组的中等难度题&#xff1a;除自身以外数组的乘积。 题目链接&#xff1a;https://leetcode.cn/problems/product-of-array-except-self/description/?envTypestudy-plan-v2&envIdtop-interview-150 …

docker基础到进阶

基础 文章目录 基础1.Docker简介2.Docker基础概念3.Docker安装4.Docker命令4.1 镜像命令4.2 容器命令 5. 数据卷5.1具名挂载5.2 匿名挂载 进阶1. 镜像5.2 Dockerfile5.3 网络1.网络模式2.网络操作 DockerCompose1.基本语法 总结 这篇文章记录了以下的内容&#xff1a; 1️⃣ 利…

达梦数据库的系统视图v$object_usage

达梦数据库的系统视图v$object_usage 在达梦数据库&#xff08;DM Database&#xff09;中&#xff0c;V$OBJECT_USAGE 视图提供了关于数据库对象的使用情况和统计信息。这些对象可以包括表、索引、视图、存储过程等。通过 V$OBJECT_USAGE 视图&#xff0c;数据库管理员可以监…

如何使用Hive构建网络电视剧收视率分析系统:大数据实战教程

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

什么?入网小助手无法卸载?我来手把手教你

简介 之前装了 XXXXX 公司的入网小助手&#xff0c;卸载的时候发现要验证码&#xff0c;我这小脾气就上来了&#xff0c;对待流氓软件是可忍熟不可忍&#xff01;&#xff01;&#xff01; 这里介绍的只是一种方式&#xff0c;嫌麻烦的可以进入安全模式直接删除安装目录内容&…

操作系统----锁

锁 锁就是一个变量 为什么需要锁&#xff1f;&#xff1a;&#xff1a;需要原子性的执行一系列的操作指令&#xff0c;程序员在源代码中加锁&#xff0c;放在临界区周围&#xff0c;保证临界区能够像单条原子指令一样执行。 举例说明 锁&#xff08;通常是一个互斥量mutex&…

大数据5v特性、集群、分布式

目录 数据分析六部曲 大数据的特点 &#xff08;5v特征&#xff09; 分布式与集群的区别 常用的分布式方案 数据分析六部曲 明确分析目的和思路&#xff1a;确保分析框架的体系化和逻辑性&#xff0c;简单来说就是先分析什么&#xff0c;后分析什么&#xff0c;使得各个分析…

K-means算法原理及应用场景

1. 算法原理 K-means是一种广泛使用的聚类算法&#xff0c;其目标是将数据点划分为K个簇&#xff0c;使得簇内的点尽可能地接近簇中心&#xff08;质心&#xff09;&#xff0c;而簇间的点则尽可能地远离。算法的核心思想是最小化簇内的平方误差。 过程&#xff1a; 初始化&a…

命题的相关知识

一、推论 推论由前提和结论两部分构成。前提和结论部分都是命题。 命题是推论的基本单位 命题特点&#xff1a;1、是陈述句 2、有确定的值&#xff08;不是对就是错&#xff09; 知不知道真假不重要&#xff0c;有真假就行 连接词和简单命题组成了复合命题。 二、…

前端:html+css:伪类画箭头(实心)

一、效果图 二、代码 html <div class"rectangle">AC/DC</div> css /* 图形 */ .rectangle {position: relative;width: 50px;height: 20px;background-color: #3498db;color: white; } .rectangle:before {content: ;position: absolute;top: 0;l…

Python-进阶-Excel基本操作

文章目录 Excel 基本操作1. 概述2. 写入2.1 使用 xlwt2.2 使用 XlsxWriter 3. 读取4. 修改 Excel 基本操作 1. 概述 在数据处理方面&#xff0c;Python 一直扮演着重要的角色&#xff0c;对于 Excel 操作&#xff0c;它有着完整且成熟的第三方库&#xff0c;使用也较为简单。…

用IP代理网速过慢:原因分析与解决方案

使用IP代理时网速过慢的原因及解决方案 在现代互联网环境中&#xff0c;使用IP代理已成为保护隐私的常见手段。然而&#xff0c;许多用户在使用代理时常常会遇到网速过慢的问题&#xff0c;这不仅影响了使用体验&#xff0c;还可能导致工作效率下降。本文将探讨导致IP代理网速…

Cornerstone3D Tools对影像进行交互(上篇)-基础交互工具及同步器

⛳️ 前言 在我们日常需求中&#xff0c;除了需要对影像进行可视化展示外&#xff0c;大多数场景下还需要对影像进行调整、注释、分割等操作。Cornerstone3DTools库则支持大多数需要的交互功能。CornerstoneTools支持的工具类型主要分为以下4类&#xff1a; 基础交互类工具&am…

VS2022 Cmake项目构建 Qt

一.创建文件和配置CMakeLists 1.创建头文件MainWindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>namespace Ui {class MainWindow; }class MainWindow : public QMainWindow {Q_OBJECTpublic:explicit MainWindow(QWidget* parent nullptr)…