MySQL索引

前言

这一章学习的是MySQL关于索引方面的知识,索引定义如下:

MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构。

提取句子主干,就可以得到索引的本质:索引是数据结构

1、索引的分类

  • 主键索引(primary key)

    • 唯一的标识,主键不可重复,只能有一个列作为主键
  • 唯一索引(unique key)

    • 避免重复的列出现,唯一索引可以重复,多个列可以标识
  • 常规索引(key/index)

    • 默认的,index/key 关键字来设置
  • 全文索引(fulltext)

    • 在特定的数据库引擎下才有,myisam
    • 快速定位数据

2、索引的使用

-- 索引的使用
-- 1、在建表的时候给字段增加索引
-- 2、在创建完毕后,增加索引-- 显示所有的索引信息
show index from 表名-- 增加一个索引
alter table school.student add fulltext index `studentname`(`studentname`)-- explain 分析SQL执行的状况
explain select * from student   -- 非全文索引
explain select * from student where match(studentname) against('刘')

3、索引的测试

创建一个 app_user表

CREATE TABLE `app_user` (
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) DEFAULT'' COMMENT'用户昵称',
`email` VARCHAR(50) NOT NULL COMMENT'用户邮箱',
`phone` VARCHAR(20) DEFAULT'' COMMENT'手机号',
`gender` TINYINT(4) UNSIGNED DEFAULT '0'COMMENT '性别(0:男;1:女)',
`password` VARCHAR(100) NOT NULL COMMENT '密码',
`age` TINYINT(4) DEFAULT'0'  COMMENT '年龄',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT = 'app用户表'

插入100万条数据

-- 插入100万数,耗时15.087 sec
DELIMITER $$
CREATE FUNCTION mock_data()
RETURNS INT
DETERMINISTIC
BEGINDECLARE num INT DEFAULT 1000000;DECLARE i INT DEFAULT 0;WHILE i < num DOINSERT INTO app_user(`name`,`email`,`phone`,`gender`,`password`,`age`)VALUES(CONCAT('用户',i),'12345678@qq.com',CONCAT('18',FLOOR(RAND()*(999999999-100000000)+100000000)),FLOOR(RAND()*2),UUID(),FLOOR(RAND()*100));SET i = i + 1;END WHILE;RETURN i;
END;SELECT mock_data();`app_user` -- 创建完mock_data函数后使用

未创建索引测试查询时间

SELECT * FROM app_user WHERE `name` = '用户9999' -- 总耗时: 0.481 sec
explain SELECT * FROM app_user WHERE `name` = '用户9999' -- 用explain检测执行sql情况

创建索引后测试查询时间

-- id    表名  字段名
-- create index 索引名 on 表(字段)
CREATE INDEX id_app_user_name ON app_user(`name`) -- 总耗时:2.418 sec
SELECT * FROM app_user WHERE `name` = '用户9999' -- 总耗时: 0.010 sec
explain SELECT * FROM app_user WHERE `name` = '用户9999' -- 用explain检测执行sql情况

未使用索引之前是使用遍历查询数据,创建索引之后是使用索引查询数据

可以看到,遍历查询的rows是992391,而索引查询的rows是1,大大节约时间

总结:

索引在数据量小的时候,用处不大,在数据量庞大的时候,用处很大

4、索引原则

  1. 索引不是越多越好
  2. 不要对经常变动的数据增加索引
  3. 小数据量的表不需要加索引
  4. 索引一般加在常用来查询的字段上!

索引的数据结构

hash类型的索引

btree:innodb的默认数据结构

4、索引原则

  1. 索引不是越多越好
  2. 不要对经常变动的数据增加索引
  3. 小数据量的表不需要加索引
  4. 索引一般加在常用来查询的字段上!

索引的数据结构

hash类型的索引

btree:innodb的默认数据结构

深入学习可以参考博客:MySQL索引背后的数据结构及算法原理

后话

到这里MySQL关于索引的浅层学习就结束了,如果有任何的问题和错误欢迎在评论区指出,我会一一回复!

ps:我的上一篇MySQL学习博客:MySQL学习之《MD5加密》,我都下一篇MySQL学习博客:MySQL学习之《事务使用》,有兴趣的小伙伴可以参考学习!

【MySQL】数据库的索引使用相关推荐

  1. PHP面试MySQL数据库的索引

    你好,是我琉忆,PHP程序员面试笔试系列图书的作者. 本周(2019.3.4至3.8)的一三五更新的文章如下: 周一:PHP面试MySQL数据库的基础知识 周三:PHP面试MySQL数据库的索引 周五 ...

  2. MySQL数据库创建索引的方法和好处

    MySQL 索引 数据库创建索引的几种方法 数据库建表添加索引(一) mysql创建索引三种方式 数据库索引的创建和使用 Mysql哪些字段适合建立索引 MySQL索引的创建与使用 MySQL索引是如 ...

  3. MySQL数据库之索引的应用

    前面几篇文章详细介绍了MySQL数据库的DML,DDL,DCL,DQL常用操作,本篇文章将介绍MySQL中一块对于开发和维护都比较重要的内容--MySQL索引的应用! 1.索引的作用 (1)如果索引为 ...

  4. MySQL数据库:索引的实现原理

    一.什么是索引: 索引就是一种的数据结构,通过缩小一张表中需要查询的数据来加快搜索的速度.如果没有索引,数据库不得不进行全表扫描.好比书的目录,让你更快的找到内容. 1.索引的优点:  (1)大大减少 ...

  5. 阿里P8架构师谈:MySQL数据库的索引原理、与慢SQL优化的5大原则

    MySQL凭借着出色的性能.低廉的成本.丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库.虽然性能出色,但所谓"好马配好鞍",如何能够更好的使用它,已经成为开发工程师的必修 ...

  6. mysql 强制使用索引_快速找出MySQL数据库冗余索引和未使用索引

    冗余索引和未使用索引的危害 随着上线的业务越来越多,在MySQL数据库中建的表也会越来越多,为提高查询访问速度,会创建相应的索引.但是由于技术人员的水平参差不齐,业务下线,代码逻辑变更等原因,导致线上 ...

  7. MySQL数据库:索引+事务+JDBC

    一.索引 1.1 何为索引 在数据库中数量及其庞大的时候,怎么快速找到目标呢?此时就会用到索引.一本书想快速找到自己想找的知识点,首先就会先去看目录,而索引就是相当于书的目录,方便查询. 1.2 索引 ...

  8. MySQL数据库的索引、事务和存储引擎

    目录 一.索引 1.1 索引的概念 1.2 索引的作用 1.3 创建索引的原则 1.4 索引的分类 1.5 索引的创建 1.5.1 普通索引 1.5.2 唯一索引 1.5.3 主键索引 1.5.4 组 ...

  9. mysql数据库复合索引

    mysql数据库中一张user表中,其中包含字段A,B,C,字段类型如下:A:int,B:int,C:int根据字段A,B,C按照ABC顺序建立复合索引idx_A_B_C,以下查询语句中使用到索引id ...

  10. 【面试题笔记-Java】MySQL数据库、索引、MVCC等知识点(自己整理)

    MySQL 1.MySQL的索引 索引就是帮助MySQL高效获取数据排好序的数据结构 索引数据结构: 二叉树 红黑树 hash表 B树 1.单指索引一个索引只包含单个列,一个表可以有多个单列索引 2. ...

最新文章

  1. ii7+php5.5+phpMyAdmin-4.1.0
  2. Python中str()与repr()函数的区别——repr() 的输出追求明确性,除了对象内容,还需要展示出对象的数据类型信息,适合开发和调试阶段使用...
  3. 【数字信号处理】相关函数 ( 相关函数性质 | 相关函数共轭对称性质 | 实信号自相关函数偶对称 | 复信号自相关函数共轭对称 | 复信号互相关函数共轭对称 )
  4. Java并发编程实战~volatile
  5. linux启动mysql1820_linux 系统下MySQL5.7重置root密码(完整版,含ERROR 1820 (HY000)解决方案)...
  6. 使用C#+Edge (Chromium)进行Web自动化测试
  7. java多线程【线程常用方法】
  8. [dhtmlx]group task 失效问题解决
  9. AcWing1090.绿色通道(单调队列DP)
  10. 匈牙利命名法、骆驼命名法、帕斯卡(pascal)命名法 C#命名规范
  11. Atitti v5住宿服务部后勤部建设指引指南.docx
  12. 【图像去噪】基于matlab GUI中值滤波图像去噪【含Matlab源码 205期】
  13. 香港公司章程中英文样本
  14. 网络编程中同步与异步,IO阻塞与非阻塞总结
  15. [PPTX解析] 图片效果算法篇:设置透明色
  16. Hack The Box-meow
  17. 创建最大堆、最小堆、图解堆排序
  18. OSDU(Open Group Open Subsurface Data Universe)数据平台研究笔记
  19. java调用visa的dll库,查看新闻/公告--[备忘]Java中,使用JNA调用Visa32.dll,控制频谱仪~~...
  20. ABAP 系统变量SY-INDEX与SY-TABIX

热门文章

  1. 牛吃草问题(解系数方程)
  2. MySQL 日期类型及默认设置
  3. PerformanceCounter 性能计数器的使用
  4. vue使用leafLet(绘图工具详解)
  5. JMeter英文版界面介绍
  6. 应用现代化语境下的技术重塑:谁在帮助企业自我革命?
  7. mycat mysql 性能测试_mycat读写分离性能测试
  8. 异步和同步,阻塞和非阻塞区别
  9. 423 从英文中重建数字(找规律)
  10. WindowsAPI详解——TerminateProcess 终止|杀死其它进程