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 05 MySQL
如何使用Maxwell实时同步mysql数据
Apr 08 MySQL
52条SQL语句教你性能优化
May 25 MySQL
MySQL通过binlog恢复数据
May 27 MySQL
mysql left join快速转inner join的过程
Jun 30 MySQL
浅谈MySQL函数
Oct 05 MySQL
MYSQL 表的全面总结
Nov 11 MySQL
MySQL为数据表建立索引的原则详解
Mar 03 MySQL
mysql 8.0.27 绿色解压版安装教程及配置方法
Apr 20 MySQL
MySQL索引 高效获取数据的数据结构
May 02 MySQL
MySQL数据库简介与基本操作
May 30 MySQL
Mysql中@和@@符号的详细使用指南
Jun 05 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
一个图片地址分解程序(用于PHP小偷程序)
2014/08/23 PHP
ThinkPHP框架里隐藏index.php
2016/04/12 PHP
ThinkPHP框架实现的邮箱激活功能示例
2018/06/15 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
javascript flash下fromCharCode和charCodeAt方法使用说明
2008/01/12 Javascript
javascript 尚未实现错误解决办法
2008/11/27 Javascript
javascript 禁止复制网页
2009/06/11 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
JavaScript创建一个object对象并操作对象属性的用法
2015/03/23 Javascript
AspNet中使用JQuery boxy插件的确认框
2015/05/20 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
2015/12/20 Javascript
微信小程序 wx:key详细介绍
2016/10/28 Javascript
webpack 3.X学习之多页面打包的方法
2018/09/04 Javascript
Vue axios设置访问基础路径方法
2018/09/19 Javascript
详解VUE单页应用骨架屏方案
2019/01/17 Javascript
LayUi数据表格自定义赋值方式
2019/10/26 Javascript
vue 关闭浏览器窗口的时候,清空localStorage的数据示例
2019/11/06 Javascript
详谈Object.defineProperty 及实现数据双向绑定
2020/07/18 Javascript
[01:54]TI珍贵瞬间系列(三):翻盘
2020/08/28 DOTA
Python选择排序、冒泡排序、合并排序代码实例
2015/04/10 Python
Django的session中对于用户验证的支持
2015/07/23 Python
TensorFlow卷积神经网络之使用训练好的模型识别猫狗图片
2019/03/14 Python
在windows下使用python进行串口通讯的方法
2019/07/02 Python
在python中,使用scatter绘制散点图的实例
2019/07/03 Python
python使用多线程编写tcp客户端程序
2019/09/02 Python
关于python tushare Tkinter构建的简单股票可视化查询系统(Beta v0.13)
2020/10/19 Python
CSS3 三维变形实现立体方块特效源码
2016/12/15 HTML / CSS
canvas拼图功能实现代码示例
2018/11/21 HTML / CSS
Ibatis如何使用动态表名
2015/07/12 面试题
贯彻学习两会心得体会范文
2014/03/17 职场文书
设计师求职信模板
2014/05/06 职场文书
社会工作专业求职信
2014/07/15 职场文书
学校纪律作风整改措施思想汇报
2014/10/11 职场文书
2014初中数学教研组工作总结
2014/12/19 职场文书
2015廉洁自律个人总结
2015/02/14 职场文书
辩论会主持词
2015/07/03 职场文书