MySQL索引篇之千万级数据实战测试


Posted in MySQL onApril 05, 2021
  1. MySQL索引创建

先说明一个问题啊,如果你创建数据表时创建了主键,此时主键列会自动创建索引

-- 创建索引的语法格式
-- alter table 表名 add index 索引名[可选](列名, ..)
-- 给name字段添加索引
alter table classes add index my_name (name);
  1. 索引删除
-- 删除索引的语法格式
-- alter table 表名 drop index 索引名
alter table classes drop index my_name;

-- 备注:如果不知道索引名,可以查看创表sql语句
show create table classes;
  1. 特殊索引–联合索引说明:

3.1. 联合索引又叫复合索引,即一个索引覆盖表中两个或者多个字段,一般用在多个字段一起查询的时候
3.2 减少磁盘空间开销,因为每创建一个索引,其实就是创建了一个索引文件,那么会增加磁盘空间的开销。
3.3 联合索引的最左原则:在使用联合索引的时候,我们要遵守一个最左原则,即index(name,age)支持 name 、name 和 age 组合查询,而不支持单独 age 查询,因为没有用到创建的联合索引。

  • 联合索引的创建
-- 创建联合索引
alter table teacher add index (name,age);
  • 假设我们已经创建了(name, age)的联合索引,看下面:
-- 下面的查询使用到了联合索引
select * from stu where name='张三' -- 这里使用了联合索引的name部分
select * from stu where name='李四' and age=10 -- 这里完整的使用联合索引,包括 name 和 age 部分 
-- 下面的查询没有使用到联合索引
select * from stu where age=10 -- 因为联合索引里面没有这个组合,只有 name | name age 这两种组合
  1. 接下来,我们展示一个索引实战案例 – 对比查询效率提升:
# 1. 创建测试表testindex:
create table test_index(title varchar(10));
# 2.  向数据表中写入数据
from pymysql import connect

def main():
    # 创建Connection连接
    conn = connect(host='localhost',port=3306,database='python',user='root',password='mysql',charset='utf8')
    # 获得Cursor对象
    cursor = conn.cursor()
    # 插入10万次数据
    for i in range(10000000):
        cursor.execute("insert into test_index values('ha-%d')" % i)
    # 提交数据
    conn.commit()

if __name__ == "__main__":
    main()

# 3. 开启运行时间监测:
set profiling=1;
# 4. 查找第1000万条数据ha-99999999  (没有索引的情况)
select * from test_index where title='ha-99999999';
# 5. 查看执行的时间:
show profiles;
# 6. 给title字段创建索引:
alter table test_index add index (title);
# 7. 再次执行查询语句           (索引已经创建的情况)
select * from test_index where title='ha-99999999';
# 8. 再次查看执行的时间
show profiles;
  • 未建立索引的情况下查询时间:
    MySQL索引篇之千万级数据实战测试
  • 建立索引之后的数据查询时间:
    MySQL索引篇之千万级数据实战测试
    对比计算:
    MySQL索引篇之千万级数据实战测试

总结:本次测试结果,创建索引查询与无索引查询对比之下效率提升105倍。

MySQL 相关文章推荐
MySQL慢查询的坑
Apr 28 MySQL
MySQL时间设置注意事项的深入总结
May 06 MySQL
MySQL数字类型自增的坑
May 07 MySQL
MySQL 数据恢复的多种方法汇总
Jun 21 MySQL
mysql连接查询中and与where的区别浅析
Jul 01 MySQL
MySQL深度分页(千万级数据量如何快速分页)
Jul 25 MySQL
MySQL中datetime时间字段的四舍五入操作
Oct 05 MySQL
详解MySql中InnoDB存储引擎中的各种锁
Feb 12 MySQL
mysql 8.0.27 绿色解压版安装教程及配置方法
Apr 20 MySQL
MySQL存储过程及语法详解
Aug 05 MySQL
MySQL使用IF语句及用case语句对条件并结果进行判断 
Sep 23 MySQL
postgresql如何找到表中重复数据的行并删除
May 08 MySQL
MySQL表的增删改查(基础)
Apr 05 #MySQL
MySQL入门命令之函数-单行函数-流程控制函数
Apr 05 #MySQL
浅析InnoDB索引结构
Apr 05 #MySQL
mysql知识点整理
Apr 05 #MySQL
MySQL令人咋舌的隐式转换
Apr 05 #MySQL
MySQL锁机制
MySQL学习总结-基础架构概述
You might like
总集篇&特番节目先行播出!《SAO Alicization War of Underworld》第2季度TV动画4月25日放送!
2020/03/06 日漫
雄兵连:第三季确定会出,不过时间未定,鹤熙是第三季的主角!
2020/03/13 国漫
海贼王动画变成“真人”后,凯多神还原,雷利太帅了!
2020/04/09 日漫
php 获取客户端的真实ip
2009/11/30 PHP
php实现阿拉伯数字和罗马数字相互转换的方法
2015/04/17 PHP
php简单处理XML数据的方法示例
2017/05/19 PHP
一个简单的JavaScript数据缓存系统实现代码
2010/10/24 Javascript
JavaScript高级程序设计(第3版)学习笔记10 再访js对象
2012/10/11 Javascript
jquery if条件语句的写法
2016/05/19 Javascript
Jquery对新插入的节点 绑定Click事件失效的解决方法
2016/06/02 Javascript
原生js获取元素样式的简单方法
2016/08/06 Javascript
JavaScript数据结构之二叉查找树的定义与表示方法
2017/04/12 Javascript
用Cordova打包Vue项目的方法步骤
2019/02/02 Javascript
解决layer图标icon不加载的问题
2019/09/04 Javascript
vuex实现像调用模板方法一样调用Mutations方法
2019/11/06 Javascript
python使用cPickle模块序列化实例
2014/09/25 Python
Windows下为Python安装Matplotlib模块
2015/11/06 Python
Python中实现switch功能实例解析
2018/01/11 Python
用TensorFlow实现多类支持向量机的示例代码
2018/04/28 Python
python实现杨氏矩阵查找
2019/03/02 Python
ERLANG和PYTHON互通实现过程详解
2019/07/05 Python
python的re模块使用方法详解
2019/07/26 Python
python try except返回异常的信息字符串代码实例
2019/08/15 Python
Python requests模块基础使用方法实例及高级应用(自动登陆,抓取网页源码)实例详解
2020/02/14 Python
Anaconda的安装及其环境变量的配置详解
2020/04/22 Python
HTML5安全介绍之内容安全策略(CSP)简介
2012/07/10 HTML / CSS
VisionPros美国站:加拿大在线隐形眼镜和眼镜零售商
2020/02/11 全球购物
大学同学十年聚会感言
2014/02/21 职场文书
教师应聘自荐信范文
2014/03/14 职场文书
体育课课后反思
2014/04/24 职场文书
竞选班长演讲稿500字
2014/08/22 职场文书
2014最新预备党员思想汇报范文:中国梦,我的梦
2014/10/25 职场文书
反邪教警示教育活动总结
2015/05/09 职场文书
感谢师恩主题班会
2015/08/17 职场文书
python中pandas.read_csv()函数的深入讲解
2021/03/29 Python
何时使用Map来代替普通的JS对象
2021/04/29 Javascript