MySQL入门学习教程(三)

上一章给大家说的是数据库的视图,存储过程等等操作,这章主要讲索引,以及索引注意事项,如果想看前面的文章,url如下:

  • MYSQL入门全套(第一部)
  • MYSQL入门全套(第二部)

索引简介

索引是对数据库表中一个或多个列(例如,employee 表的姓名 (name) 列)的值进行排序的结构。如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息。

例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引插叙的速度要比没有索引的速度要快很多

MySQL中常见索引有:

  • 普通索引
  • 唯一索引
  • 主键索引
  • 组合索引

下面就应用一下索引吧

索引操作

一、普通索引(index)

普通所以只有一个功能,就是加快查找速度。操作如下

1、先创建一个表

create table tab1(nid int not null auto_increment primary key,name varchar(32) not null,email varchar(64) not null,extra text,index ix_name (name)
)

2、创建索引

create index 索引名称 on 表名(列名)

3、删除索引

drop 索引名称 on 表名;

4、查看索引

show index from 表名;

5、注意事项(对于创建索引时如果是BLOB 和 TEXT 类型,必须指定length。)

create index index_name on tab1(extra(32));

二、唯一索引(unique)

唯一性索引unique index和一般索引normal index最大的差异就是在索引列上增加了一层唯一约束。添加唯一性索引的数据列可以为空,但是只要存在数据值,就必须是唯一的。

1、创建表+唯一索引

create table tab2(nid int not null auto_increment primary key,name varchar(32) not null,email varchar(64) not null,extra text,unique ix_name (name)  -- 重点在这里
)

2、创建索引

create unique index 索引名 on 表名(列名)

3、删除索引

drop unique index 索引名 on 表名

三、主键索引

在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。主键索引要求主键中的每个值是唯一的。当在查询中使用主键索引时,它还允许快速访问数据。数据不能为空

1、创建表+主键索引

create table in1(nid int not null auto_increment,name varchar(32) not null,email varchar(64) not null,extra text,primary key(nid),index zhang (name)
)

2、创建主键

alter table 表名 add primary key(列名);

3、删除主键

alter table 表名 drop primary key;
alter table 表名  modify  列名 int, drop primary key;

四、组合索引

组合索引,就是组合查询的意思嘛嘻嘻,将两列或者多列组合成一个索引进行查询

其应用场景为:频繁的同时使用n列来进行查询,如:where name = ‘小白’ and email = 666。

1、创建表

create table in3(nid int not null auto_increment primary key,name varchar(32) not null,email varchar(64) not null,extra text
)

2、创建组合索引

create index ix_name_email on in3(name,email);

如上创建组合索引之后,查询有的会使用索引,有的不会:

  • name and email – 使用索引
  • name – 使用索引
  • email – 不使用索引

索引注意事项

1、正确使用索引

数据库表中添加索引后能够让查询数据库速度飞快,但前提必须是正确的使用索引来查询,如果以错误的方式使用,则即使建立索引也会不奏效。

下面这些情况不会使用到索引:

1、like '%xx'select * from tb1 where name like '%cn';2、使用函数select * from tb1 where reverse(name) = '小白';3、orselect * from tb1 where nid = 1 or email='zhangyanlin@live.com';特别的:当or条件中有未建立索引的列才失效,以下会走索引select * from tb1 where nid = 1 or name = 'zhangyanlin';select * from tb1 where nid = 1 or email = 'zhangyanlin@live.com' and name = 'aylin'4、类型不一致如果列是字符串类型,传入条件是必须用引号引起来,不然...select * from tb1 where name = 999;5、 !=select * from tb1 where name != 'aylin'特别的:如果是主键,则还是会走索引select * from tb1 where nid != 1236、 >select * from tb1 where name > 'alex'特别的:如果是主键或索引是整数类型,则还是会走索引select * from tb1 where nid > 123select * from tb1 where num > 1237、order byselect email from tb1 order by name desc;当根据索引排序时候,选择的映射如果不是索引,则不走索引特别的:如果对主键排序,则还是走索引:select * from tb1 order by nid desc;8、 组合索引最左前缀如果组合索引为:(name,email)name and email       -- 使用索引name                 -- 使用索引email                -- 不使用索引

2、其他注意事项

  • 避免使用``select *
  • ```count(1)或count(列) 代替 count``(*)`
  • 创建表时尽量时 ``char 代替 ``varchar
  • 表的字段顺序固定长度的字段优先
  • 组合索引代替多个单列索引(经常使用多个条件查询时)
  • 尽量使用短索引
  • 使用连接(``JOIN``)来代替子查询(Sub-Queries)
  • 连表时注意条件类型需一致
  • 索引散列值(重复少)不适合建索引,例:性别不适合

3、执行计划

explain + 查询SQL - 用于显示SQL执行信息参数,根据参考信息可以进行SQL优化

mysql> explain select * from tb2;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | tb2   | ALL  | NULL          | NULL | NULL    | NULL |    2 | NULL  |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)

    id查询顺序标识如:mysql> explain select * from (select nid,name from tb1 where nid < 10) as B;+----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+| id | select_type | table      | type  | possible_keys | key     | key_len | ref  | rows | Extra       |+----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+|  1 | PRIMARY     | <derived2> | ALL   | NULL          | NULL    | NULL    | NULL |    9 | NULL        ||  2 | DERIVED     | tb1        | range | PRIMARY       | PRIMARY | 8       | NULL |    9 | Using where |+----+-------------+------------+-------+---------------+---------+---------+------+------+-------------+特别的:如果使用union连接气值可能为nullselect_type查询类型SIMPLE          简单查询PRIMARY         最外层查询SUBQUERY        映射为子查询DERIVED         子查询UNION           联合UNION RESULT    使用联合的结果...table正在访问的表名type查询时的访问方式,性能:all < index < range < index_merge < ref_or_null < ref < eq_ref < system/constALL             全表扫描,对于数据表从头到尾找一遍select * from tb1;特别的:如果有limit限制,则找到之后就不在继续向下扫描select * from tb1 where email = 'seven@live.com'select * from tb1 where email = 'seven@live.com' limit 1;虽然上述两个语句都会进行全表扫描,第二句使用了limit,则找到一个后就不再继续扫描。INDEX           全索引扫描,对索引从头到尾找一遍select nid from tb1;RANGE          对索引列进行范围查找select *  from tb1 where name < 'alex';PS:between andin>   >=  <   <=  操作注意:!= 和 > 符号INDEX_MERGE     合并索引,使用多个单列索引搜索select *  from tb1 where name = 'alex' or nid in (11,22,33);REF             根据索引查找一个或多个值select *  from tb1 where name = 'seven';EQ_REF          连接时使用primary key 或 unique类型select tb2.nid,tb1.name from tb2 left join tb1 on tb2.nid = tb1.nid;CONST           常量表最多有一个匹配行,因为仅有一行,在这行的列值可被优化器剩余部分认为是常数,const表很快,因为它们只读取一次。select nid from tb1 where nid = 2 ;SYSTEM          系统表仅有一行(=系统表)。这是const联接类型的一个特例。select * from (select nid from tb1 where nid = 1) as A;possible_keys可能使用的索引key真实使用的key_lenMySQL中使用索引字节长度rowsmysql估计为了找到所需的行而要读取的行数 ------ 只是预估值extra该列包含MySQL解决查询的详细信息“Using index”此值表示mysql将使用覆盖索引,以避免访问表。不要把覆盖索引和index访问类型弄混了。“Using where”这意味着mysql服务器将在存储引擎检索行后再进行过滤,许多where条件里涉及索引中的列,当(并且如果)它读取索引时,就能被存储引擎检验,因此不是所有带where子句的查询都会显示“Using where”。有时“Using where”的出现就是一个暗示:查询可受益于不同的索引。“Using temporary”这意味着mysql在对查询结果排序时会使用一个临时表。“Using filesort”这意味着mysql会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。mysql有两种文件排序算法,这两种排序方式都可以在内存或者磁盘上完成,explain不会告诉你mysql将使用哪一种文件排序,也不会告诉你排序会在内存里还是磁盘上完成。“Range checked for each record(index map: N)”这个意味着没有好用的索引,新的索引将在联接的每一行上重新估算,N是显示在possible_keys列中索引的位图,并且是冗余的。

详细介绍

4、limit分页

分页功能是个值得关注的问题,因为我们会一直用到

每页显示10条:
当前 118 120, 125倒序:大      小980    970  7 6  6 5  54  43  3221 19 98     
下一页:select * from tb1 where nid < (select nid from (select nid from tb1 where nid < 当前页最小值 order by nid desc limit 每页数据 *【页码-当前页】) A order by A.nid asc limit 1)  order by nid desc limit 10;select * from tb1 where nid < (select nid from (select nid from tb1 where nid < 970  order by nid desc limit 40) A order by A.nid asc limit 1)  order by nid desc limit 10;上一页:select * from tb1 where nid < (select nid from (select nid from tb1 where nid > 当前页最大值 order by nid asc limit 每页数据 *【当前页-页码】) A order by A.nid asc limit 1)  order by nid desc limit 10;select * from tb1 where nid < (select nid from (select nid from tb1 where nid > 980 order by nid asc limit 20) A order by A.nid desc limit 1)  order by nid desc limit 10;

至此mysql讲解到此就结束啦,喜欢的给点个赞哟

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java面试——一分钟搞懂限流算法

为什么限流 运营网站&#xff0c;经常会遇到各种挑战&#xff1a;某黑客发起DoS攻击、网络爬虫网页抓取、商品秒杀活动、双十一与618等场景&#xff0c;会使流量突然激增&#xff0c;如果不限制流量的访问就会使系统宕机。 常见的限流算法 1.漏桶算法&#xff08; LEAKY BUC…

Qt扫盲-Qt Model/View 理论总结 [下篇]

Qt Model/View 理论总结 [下篇] 一、处理Item view 中的选择1. 概念1. 当前 item 和已选 item 2. 使用选择 model1. 选择 item2. 读取选区状态3. 更新选区4. 选择 model 中的所有项 二、创建新 model1. 设计一个 model2. 只读示例 model1. model 的尺寸2. model 头和数据 3. 可…

【0.2】lubancat鲁班猫4远程ubuntu22.04.2 无需任何安装

环境 lubancat4鲁班猫4 (4G0)不带emmc 系统镜像ubuntu-22.04.2-desktop-arm64-lubancat-4.img 网络环境:有线网络与本win10电脑同意环境 操作步骤ubuntu正常开机登陆用户&#xff0c;连接好网络进入设置>网络查看设备当前局域网IP 如192.168.199.159进入设置>共享>远程…

【golang】怎样判断一个变量的类型?

怎样判断一个变量的类型&#xff1f; package mainimport "fmt"var container []string{"zero", "one", "two"} func main() {container : map[int]string{0: "zero", 1: "one", 2: "two"}fmt.Printf…

深入了解 Vue 3 组件间通信机制

什么是组件&#xff1f; 在 Vue3 中&#xff0c;组件是构建应用界面的核心概念之一。组件可以看作是可复用、自包含和可组合的代码块&#xff0c;用于封装 UI 元素和相应的行为逻辑。 通俗来说就是&#xff0c;组件&#xff08;Component&#xff09;是一种对数据和方法的简单…

【Vue3】自动引入插件-`unplugin-auto-import`

Vue3自动引入插件-unplugin-auto-import&#xff0c;不必再手动 import 。 自动导入 api 按需为 Vite, Webpack, Rspack, Rollup 和 esbuild 。支持TypeScript。由unplugin驱动。 插件安装&#xff1a;unplugin-auto-import 配置vite.config.ts&#xff08;配置完后需要重启…

阿里云Windows服务器怎么安装多个网站?

本文阿里云百科介绍如何在Windows Server 2012 R2 64位系统的ECS实例上使用IIS服务器搭建多个Web站点。本教程适用于熟悉Windows操作系统&#xff0c;希望合理利用资源、统一管理站点以提高运维效率的用户。比如&#xff0c;您可以在一台云服务器上配置多个不同分类的博客平台或…

【MySQL--->数据库操作】

文章目录 [TOC](文章目录) 一、操作语句1.增2.删3.改4.查5.备份 二、字符集与校验规则 一、操作语句 1.增 语句格式:create database [if no exists]数据库名[create_specification [,create_specification] …]; 中括号内是可选项,if no exists是指如果数据库不存在就创建,存…

Https、CA证书、数字签名

Https Http协议 Http协议是目前应用比较多应用层协议&#xff0c;浏览器对于Http协议已经实现。Http协议基本的构成部分有 请求行 &#xff1a; 请求报文的第一行请求头 &#xff1a; 从第二行开始为请求头内容的开始部分。每一个请求头都是由K-V键值对组成。请求体&#xf…

混合云环境实现K8S可观测的6大策略

2023年&#xff0c;原生云应用及平台发展迅猛。大量企业都在努力发挥其应用程序的最大潜力&#xff0c;以确保极致的用户体验并推动业务增长。 混合云环境的兴起和容器化技术(如Kubernetes)的采用彻底改变了现代应用程序的开发、部署和扩展方式。 在这个数字舞台上&#xff0c;…

【Linux 网络】网络层协议之IP协议

IP协议 IP协议所处的位置网络层要解决的问题IP协议格式分片与组装网段划分特殊的IP地址IP地址的数量限制私网IP地址和公网IP地址路由 IP协议所处的位置 IP指网际互连协议&#xff0c;Internet Protocol的缩写&#xff0c;是TCP/IP体系中的网络层协议。 网络层要解决的问题 网络…

Spring 创建和使用

文章目录 创建 Spring 项目1. 创建一个Maven项目2. 添加 Spring 框架支持3. 添加启动类 存储 Bean 对象创建一个 Bean将 Bean 注册到容器 获取并使用 Bean 对象创建 Spring 上下文获取指定的 Bean 对象使用 Bean 对象 getBean() 的用法总结 创建 Spring 项目 1. 创建一个Maven…