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触发器的使用
May 24 MySQL
mysql5.7使用binlog 恢复数据的方法
Jun 03 MySQL
MySQL子查询中order by不生效问题的解决方法
Aug 02 MySQL
MySQL中的引号和反引号的区别与用法详解
Oct 24 MySQL
关于MySQL中的 like操作符详情
Nov 17 MySQL
SQL优化老出错,那是你没弄明白MySQL解释计划用法
Nov 27 MySQL
SQL注入篇学习之盲注/宽字节注入
Mar 03 MySQL
MySQL插入数据与查询数据
Mar 25 MySQL
MySql数据库 查询时间序列间隔
May 11 MySQL
mysql实现将字符串字段转为数字排序或比大小
Jun 14 MySQL
MySQL导致索引失效的几种情况
Jun 25 MySQL
Mysql表数据比较大情况下修改添加字段的方法实例
Jun 28 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
火影忍者:三大瞳力之一的白眼,为什么没有写轮眼那么出色?
2020/03/02 日漫
php中常用的预定义变量小结
2012/05/09 PHP
php合并js请求的例子
2013/11/01 PHP
PHP用星号隐藏部份用户名、身份证、IP、手机号等实例
2014/04/08 PHP
PHP基于关联数组20行代码搞定约瑟夫问题示例
2017/11/07 PHP
通过修改referer下载文件的方法
2008/05/11 Javascript
js实现权限树的更新权限时的全选全消功能
2009/02/17 Javascript
自己动手开发jQuery插件教程
2011/08/25 Javascript
多浏览器兼容性比较好的复制到剪贴板的js代码
2011/10/09 Javascript
JavaScript中把数字转换为字符串的程序代码
2013/06/19 Javascript
JS和Jquery获取和修改label的值的示例代码
2014/01/15 Javascript
jQuery实现鼠标选文字发新浪微博的方法
2016/04/02 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
2016/12/08 Javascript
JavaScript实现图片瀑布流和底部刷新
2017/01/02 Javascript
JavaScript常用数组操作方法,包含ES6方法
2020/05/10 Javascript
在vue中使用express-mock搭建mock服务的方法
2018/11/07 Javascript
JS+HTML5 canvas绘制验证码示例
2018/12/05 Javascript
Vue中Axios从远程/后台读取数据
2019/01/21 Javascript
微信小程序MUI侧滑导航菜单示例(Popup弹出式,左侧不动,右侧滑动)
2019/01/23 Javascript
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
JS获取表格视图所选行号的ids过程解析
2020/02/21 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
[07:57]2018DOTA2国际邀请赛寻真——PSG.LGD凤凰浴火
2018/08/12 DOTA
python操作 hbase 数据的方法
2016/12/18 Python
OpenCV实现人脸识别
2017/04/07 Python
python3+PyQt5实现自定义窗口部件Counters
2018/04/20 Python
python3 字符串/列表/元组(str/list/tuple)相互转换方法及join()函数的使用
2019/04/03 Python
django创建超级用户过程解析
2019/09/18 Python
Python中的X[:,0]、X[:,1]、X[:,:,0]、X[:,:,1]、X[:,m:n]和X[:,:,m:n]
2020/02/13 Python
幼儿园园长岗位职责
2013/11/26 职场文书
产品销售员岗位职责
2013/12/18 职场文书
网络程序员自荐信
2014/01/25 职场文书
对祖国的寄语大全
2014/04/11 职场文书
建筑施工安全生产责任书
2014/07/22 职场文书
教师国庆节演讲稿范文2014
2014/09/21 职场文书
免职通知
2015/04/23 职场文书