MySql之索引

2023-05-16

通常小型项目涉及数据量比较小,数据查询频率不高,索引通常会被忽略。但当数据量较大,涉及多个表,查询较为频繁时,我们需要对查询性能进行优化,此时,建立合适的索引确是主要的方法之一。

通常,mysql数据库查询有两种方式:

一种是:全表扫描;

另外一种是:利用数据表中建立的索引进行扫描。

索引可以提高查询效率,下面我们来举例说明如何做到的。

例如:有三个表,table1,table2, table3,分别只含有一列c1、c2、c3,每个表中分别含有N行记录,现要查询对应值相等的行。

SQL查询语句如下:

SELECT c1,c2,c3 FROM table1,table2, table3 WHERE c1=c2 AND c1=c3;

不建索引时,需要从遍历table1、table2、table3中的所有记录组合,查询次数为:N*N*N,如下图。

 

如果对三个表都建索引,那么从table1中的第一行记录中的c1的值开始,如值为value,通过table2的索引表,直接通过value的指针找到value在table2中的记录,然后同理通过table3的索引表,通过value的指针找到value在table3中的记录;接着继续查询table1中的下一行记录,重复上面的步骤。最终扫描次数为:N。如下图所示。

 由以上可以看出,建立索引查询效率大大提高。

 常用索引类型:

主键索引:系统自动创建的,唯一,并且列值不能为空。创建使用关键字,PRIMARY KEY;

唯一索引:索引列值必须唯一,不能重复,但可以为空值。创建使用关键字,UNIQUE;

普通索引:索引列值可以重复,可以取空值。创建使用关键字,INDEX或者KEY;

聚簇索引:就是数据存储的物理存储顺序,非聚簇索引就是索引顺序与数据的物理顺序无关。一个表只能有一个聚簇索引。目前只有InoDB和solidDB支持。

全文索引:只能创建在varchar或text的列上;建立全文索引能够在全文索引的列上进行查找。

(1)单列索引:一个索引只包含表中的一个列;比创建一个学号ID的索引;以name再创建一个姓名的单列索引。即每个索引包含一个列。

(2)组合索引(复合索引或多列索引):就是表中的两个列或多个列来创建成一个索引;比如;以用户ID、用户名Name、用户年龄Age来创建的索引就是联合索引。

索引SQL语句

# 创建索引

mysql> create index index_sname on student(sname);
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0

# 查询表索引

mysql> show index from student;
+---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| student |          0 | PRIMARY     |            1 | sid         | A         |           3 | NULL     | NULL   |      | BTREE      |         |               |
| student |          1 | FK_CID      |            1 | cid         | A         |           2 | NULL     | NULL   | YES  | BTREE      |         |               |
| student |          1 | index_sname |            1 | sname       | A         |           3 | NULL     | NULL   | YES  | BTREE      |         |               |
+---------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set

# 删除索引

mysql> drop index index_sname on student;
Query OK, 0 rows affected
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from student;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| student |          0 | PRIMARY  |            1 | sid         | A         |           3 | NULL     | NULL   |      | BTREE      |         |               |
| student |          1 | FK_CID   |            1 | cid         | A         |           2 | NULL     | NULL   | YES  | BTREE      |         |               |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySql之索引 的相关文章

  • MySql 5.7 函数 UUID() 默认排序规则 - 非法混合排序规则

    Problem MySQL uuid 默认排序规则与配置连接排序规则不进行比较 我有一个使用字符集创建的数据库 表 字段 utf 8和排序规则utf8 polish ci my cnf 如下 init connect SET NAMES u
  • 如何在同一列中选择多个值?

    我正在尝试在单个列中选择多个值 基本上我希望查询选择列下的所有内容family有价值观Software 1Y XI 1Y and P1 1Y 我正在运行这个查询 SELECT salesorder masterproduct family
  • SELECT COUNT() 与 mysql_num_rows();

    我有一个大表 60 数百万条记录 我正在使用 PHP 脚本来浏览该表 PHP 脚本 带分页 加载速度非常快 因为 表引擎是InnoDB因此SELECT COUNT 非常慢并且mysql num rows 不是一个选项 所以我将总行数 我用来
  • 将我的本地数据库(Mysql)复制到远程数据库(phpmyadmin)

    My MySQL database local server is connected to a weather station The data are updated continuously on my local server My
  • SQL 未插入到 Yii 中具有关系的表中

    我正在尝试创建一个用户 但所有值都没有插入到数据库中 Systems user 表与partys 表有关系 因为party id 是sytems user 的主键 没有插入任何内容 甚至没有错误 它只是返回到 创建 页面 这是我的架构 Ta
  • Mysql显示创建约束?

    有没有一种简单的方法来查询表的约束 特别是外键 就像显示创建表一样 但仅用于约束 thanks 普夫戈丁 要仅显示外键约束 您可以检查 information schema table constraints 中的constraint ty
  • PDO 和 MySQL 全文搜索

    我正在将所有站点代码从使用 mysql 函数转换为 PDO 关于 PDO 的 PHP 文档对于我的需求来说并不清楚 它为您提供了可以使用的功能 但没有详细解释它们在不同场景下的情况 基本上 我有一个 mysql 全文搜索 sql SELEC
  • 如何在我的查询中使用日期格式?

    这适用于 phpmyadmin 但是当我在代码上使用时给我一个错误 错误说 解析错误 语法错误 意外的 我的语法有什么问题 gt
  • 如何反转散列和加盐密码? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用 vBulletin 登录使用它来交叉引用数据库 md5 md5 pass salt 我如何制作一个 PHP 脚本 以便每个密码
  • Join 表(关联表)有主键吗?多对多关系

    Join 表 关联表 有主键吗 多对多的关系 我见过一些带有主键的连接表 一些没有 有人可以解释一下连接表中何时会有主键吗 为什么 先感谢您 在纯 联接 或联结表中 所有字段都将成为主键的一部分 例如 让我们考虑下表 CREATE TABL
  • 计算 MySQL 中的行数以及实际行内容

    MySQL 中有没有办法执行单个 SQL 语句来返回所选行以及结果行数 我可以做这个 SELECT COUNT FROM BigTable WHERE firstname LIKE a 这给了我一个带有计数 37 781 的结果行 我可以像
  • MySQL表按时间戳分区

    我已经对表进行了分区 由于内存不足错误 表太大 我已将其分区在时间戳列上 如下所示 CREATE TABLE test fname VARCHAR 50 NOT NULL lname VARCHAR 50 NOT NULL dob time
  • MySQL 列数据以逗号分隔列表形式返回

    我目前有一个 MySQL 表 例如 id friend 1 2 1 5 1 10 3 6 15 19 21 4 我试图获取某个特定用户的所有好友 ID 并将它们排列到一个以逗号分隔的列表中 例如 抓取了 user1 的好友 它将返回为 fr
  • 通过 SSH 隧道远程访问 MySQL 数据库

    我正在尝试编写 Java 程序来使用 ssh 隧道访问远程 mySQL 数据库 下面是我的代码 int lport 5656 int rport 3306 String rhost 111 222 333 444 String host 1
  • 无法使用 Node.JS 将 null 值发送到 MySQL 数据库

    我正在尝试发送null使用 Node JS 到我的 MySQL 数据库 con query INSERT INTO Routes routeTrigger VALUES null title test function err result
  • SQLAlchemy 在 MySQL 上使用什么列类型作为“文本”?

    我的总体用例是试图确定我是否可以编写一个与数据库无关的 至少支持 Postgres 和 MySQL 存储一些大数据作为原始文本 认为 500MB 作为粗略的理论上限 基于这个答案 https stackoverflow com a 2557
  • 如何在MySql中将bool转换为int

    我是 MySql 的新手 所以我不知道很多东西 比如数据类型的转换 如何在 MySql 中将 bool 转换为 int 还有如何在 MySql 中将十进制转换为 Int 将布尔值类型转换为整数 SELECT CAST 1 1 AS SIGN
  • 将 1 添加到字段

    如何将以下 2 个查询变成 1 个查询 sql SELECT level FROM skills WHERE id id LIMIT 1 result db gt sql query sql level int db gt sql fetc
  • 如何轻松地将多个sql文件导入MySQL数据库?

    我有一些sql文件 我想要import将它们全部一次性存入 MySQL 数据库 I go to PHPMyAdmin 访问数据库 点击import 选择一个文件并导入 当我有多个文件时 需要很长时间 我想知道是否有更好的方法来导入多个文件
  • 寻求有关标记视频系统上的“相关视频”查询的建议

    好吧 我运行一个小型视频网站 在实际的视频页面上有一条与大多数视频页面 例如 YouTube 类似的 相关视频 目前我所做的就是随机获取其标签之一并查找其他视频相同的标签 毫不奇怪 这不是一个好方法 因为有些标签非常模糊 有些视频被错误标记

随机推荐

  • postgresql |数据库 |数据库的常用备份方法总结

    前言 xff1a 数据库的重要性就不需要在这里重复了 xff0c 那么 xff0c 不管是测试环境 xff0c 还是开发环境 xff0c 亦或者是生产环境 xff0c 数据库作为系统内 xff08 项目内 xff09 的一个非常重要的组件
  • USB连接到centos7虚拟机出现错误(VMware USB Arbitration Service无法启动)

    USB连接到centos7虚拟机出现错误 有可能是因为VMware USB Arbitration Service出现无法自启动的问题 windows主机中WIN 43 R打开运行界面 xff0c 输入 接着查看VMware USB Arb
  • Centos7下配置网卡网桥

    简介 xff1a Linux系统下开启虚拟机需要配置网桥 xff0c 从而使得Linux系统里虚拟化软件的虚拟交换机与宿主机的物理网卡绑定一起 虚拟机与宿主机互相独立的IP 物理网卡监听这些IP xff0c 从而达到虚拟机与物理机在同一个局
  • 【玩转cocos2d-x之二十五】数据结构CCArray

    原创作品 xff0c 转载请标明 xff1a http blog csdn net jackystudio article details 16938787 CCArray是从cocos2d中移植过来的 xff0c 类似于Apple的NSM
  • 5、钉钉平台

    文章目录 文章目录 应用管理运行环境应用类型编程模式风神工作台基础应用信息接口权限应用发布 钉钉集成参数设置钉钉接口地址常量 钉钉集成登录钉钉事件回调接口注册通讯录事件回调群会话事件回调签到事件回调审批事件回调 日志管理签到事件回调审批事件
  • CentOS常用防火墙命令

    systemctl启动 停止 查看防火墙状态 systemctl从CentOS7 x开始引入的一个服务管理工具命令 xff0c 集 service和chkconfig的功能于一体 启动防火墙 systemctl start firewall
  • ARDUINO LCD显示简单的汉字、符号(二 已写成的字模和基于Python的检索系统)

    北 61 0x0A 0x0A 0x0A 0x1B 0x0A 0x0A 0x0A 0x1B 京 61 0x04 0x1F 0x0E 0x0A 0x0E 0x15 0x15 0x0C 市 61 0x04 0x1F 0x04 0x1F 0x15
  • MindSpore图像分类训练resnet50实现

    目录 一 mindspore简介 二 训练环境 三 数据集与数据加载 四 模型训练和验证 五 迁移学习 六 模型测试和导出 一 mindspore简介 MindSpore 是华为开源的全场景深度学习框架 xff0c 旨在实现易开发 高效执行
  • 最快的远程控制软件radmin的配置和使用

    Remote Administrator Radmin 是最快的远程控制软件 又因为它不被杀毒软件查杀 从而成为远程控制的首选 nbsp 一 radmin的配置 首先下载并解压Radmin2 1 解压后有七个文件 打开 配置r server
  • 介绍一个成功的 Git 分支模型

    英文原文 xff0c A successful Git branching model xff0c 翻译 xff1a 开源中国 在这篇文章中 xff0c 我提出一个开发模型 我已经将这个开发模型引入到我所有的项目里 xff08 无论在工作还
  • 浪潮服务器通过BMC远程安装系统

    浪潮服务器的BMC xff0c 类似于IBM服务器的IPMI xff0c 可以远程安装系统或者其他操作 前提 xff1a 1 带外ip xff1a 192 168 1 100 在bios的 lan channel 1 里面配置带外ip xf
  • Linux|错误集锦|prometheus Error on ingesting samples that are too old or are too far into the future的解决

    前情回顾 xff1a 二进制prometheus部署完成后 xff0c 在prometheus的web界面进行一些数据验证工作 下面这个是我已经恢复正常的 xff0c 其实是查询不到数据的 grafana也接收不到任何数据 问题排查 xff
  • 《软件工程导论》/ 第一章 软件工程学概述 / 1.3 软件生命周期

    概括地说 xff0c 软件生命周期由3个时期组成 xff0c 每个时期又进一步划分成若干个阶段 xff1a 软件定义 xff08 问题定义 可行性研究 需求分析 xff09 软件开发 xff08 总体设计 详细设计 编码和单元测试 综合测试
  • python开发PC端桌面应用

    项目场景 xff1a 很多情况下需要用很短的时间开发一款在windows上离线运行的小工具 xff0c 以便解决一些现实问题 比如公司近期有个紧急项目 xff0c 需要根据算法需求人工标注海量的地址信息 xff0c 开发周期和工具易用性上都
  • Vue和Flask实现前后端分离

    引言 近期了解了下目前比较热门的前端框架Vue js xff0c 新技能嘛 xff0c 只有实践了用起来了 xff0c 才能有比较直观的体验 因此考虑写个小demo练练手 xff0c 后端采用Flask提供几个Restfull风格的API
  • C/S架构的应用程序开发实战(一)

    项目背景 近期需要开发一个对巨量的图片数据进行车辆品牌信息标注的工具 xff0c 为了提高标注效率 xff0c 准备先通过现有车辆品牌识别的算法模型进行下预标注 xff0c 标注人员在此基础上进行审核和修改即可 另外 xff0c 需要统计出
  • Nginx服务安全漏洞修复

    1 安全漏洞说明 使用Nginx提供服务的产品 xff0c 经过安全扫描工具扫描后报出三个高风险 三个中风险安全漏洞 2 nginx版本过低自带安全漏洞 升级nginx版本到1 21 1后 xff0c 三个高风险漏洞消失 3 HTTP 信息
  • C/S架构的应用程序开发实战(二)

    后端服务 后端用python实现 xff0c 采用flask web框架 可从github上获取flasky源码 xff0c 在此基础上进行业务逻辑的实现 程序结构如下 xff1a app 业务逻辑实现代码 common 公共函数实现 这里
  • MySql安装相关

    windows安装mysql xff1a 1 获取并解压安装包 xff1a mysql 8 0 20 winx64 zip 2 配置环境变量 xff1a 3 管理员权限打开cmd xff0c 进入安装目录 xff1a H gt cd H t
  • MySql之索引

    通常小型项目涉及数据量比较小 xff0c 数据查询频率不高 xff0c 索引通常会被忽略 但当数据量较大 xff0c 涉及多个表 xff0c 查询较为频繁时 xff0c 我们需要对查询性能进行优化 xff0c 此时 xff0c 建立合适的索