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 MVCC机制原理详解
Apr 20 MySQL
mysql在项目中怎么选事务隔离级别
May 25 MySQL
MySql存储过程之逻辑判断和条件控制
May 26 MySQL
MySQL下使用Inplace和Online方式创建索引的教程
May 26 MySQL
SQL IDENTITY_INSERT作用案例详解
Aug 23 MySQL
Mysql 8.x 创建用户以及授予权限的操作记录
Apr 18 MySQL
CentOS MySql8 远程连接实战
Apr 19 MySQL
分析MySQL优化 index merge 后引起的死锁
Apr 19 MySQL
Mysql 文件配置解析介绍
May 06 MySQL
MySQL 语句执行顺序举例解析
Jun 05 MySQL
MySQL存储过程及语法详解
Aug 05 MySQL
MySQL 原理优化之Group By的优化技巧
Aug 14 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
PHP4实际应用经验篇(2)
2006/10/09 PHP
PHP求小于1000的所有水仙花数的代码
2012/01/10 PHP
PHP中return 和 exit 、break和contiue 区别与用法
2012/04/09 PHP
ThinkPHP框架分布式数据库连接方法详解
2017/03/14 PHP
Yii框架分页技术实例分析
2019/08/30 PHP
javascript concat数组累加 示例
2009/09/03 Javascript
js判断浏览器类型为ie6时不执行
2014/06/15 Javascript
浅谈 jQuery 事件源码定位问题
2014/06/18 Javascript
JavaScript计算某一天是星期几的方法
2015/08/05 Javascript
JavaScript中Textarea滚动条不能拖动的解决方法
2015/12/15 Javascript
jQuery插件HighCharts绘制2D带Label的折线图效果示例【附demo源码下载】
2017/03/08 Javascript
Vue之Watcher源码解析(2)
2017/07/19 Javascript
MVVM框架下实现分页功能示例
2018/06/14 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
2018/08/16 Javascript
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
2019/04/29 Javascript
laypage.js分页插件使用方法详解
2019/07/27 Javascript
Python中字典的浅拷贝与深拷贝用法实例分析
2018/01/02 Python
python使用tkinter实现简单计算器
2018/01/30 Python
对numpy中array和asarray的区别详解
2018/04/17 Python
python中计算一个列表中连续相同的元素个数方法
2018/06/29 Python
搞清楚 Python traceback的具体使用方法
2019/05/13 Python
python使用opencv实现马赛克效果示例
2019/09/28 Python
如何基于python实现脚本加密
2019/12/28 Python
python如何求数组连续最大和的示例代码
2020/02/04 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
如何利用python web框架做文件流下载的实现示例
2020/06/02 Python
Python爬取数据并实现可视化代码解析
2020/08/12 Python
Pycharm 跳转回之前所在页面的操作
2021/02/05 Python
美国著名童装品牌:OshKosh B’gosh
2016/08/05 全球购物
意大利奢侈品购物网站:Giglio
2018/01/05 全球购物
中专毕业生自荐信
2013/11/16 职场文书
业务员岗位职责
2013/11/16 职场文书
财务会计人员岗位职责
2013/11/30 职场文书
幼儿教师培训感言
2014/03/08 职场文书
领导班子专题民主生活会情况想汇报
2014/09/30 职场文书
一年级数学下册复习计划
2015/01/17 职场文书