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 07 MySQL
详解MySQL连接挂死的原因
May 18 MySQL
Mysql 用户权限管理实现
May 25 MySQL
Navicat for MySQL的使用教程详解
May 27 MySQL
MySQL query_cache_type 参数与使用详解
Jul 01 MySQL
MySQL系列之九 mysql查询缓存及索引
Jul 02 MySQL
MySQL中的隐藏列的具体查看
Sep 04 MySQL
深入讲解数据库中Decimal类型的使用以及实现方法
Feb 15 MySQL
MySQL高级进阶sql语句总结大全
Mar 16 MySQL
mysql字段为NULL索引是否会失效实例详解
May 30 MySQL
MySQL选择合适的备份策略和备份工具
Jun 01 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 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 抽象类的简单应用
2011/09/06 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
BOOM vs RR BO5 第一场 2.14
2021/03/10 DOTA
Stop SQL Server
2007/06/21 Javascript
解析arp病毒背后利用的Javascript技术附解密方法
2007/08/06 Javascript
jquery 操作单选框,复选框,下拉列表实现代码
2009/10/27 Javascript
JS 仿腾讯发表微博的效果代码
2013/12/25 Javascript
Jquery 监视按键,按下回车键触发某方法的实现代码
2014/05/11 Javascript
用原生JS获取CLASS对象(很简单实用)
2014/10/15 Javascript
jQuery中parentsUntil()方法用法实例
2015/01/07 Javascript
对Js OOP编程 创建对象的一些全面理解
2016/07/26 Javascript
简单的jQuery拖拽排序效果的实现(增强动态)
2017/02/09 Javascript
微信小程序 向左滑动删除功能的实现
2017/03/10 Javascript
vue-自定义组件传值的实例讲解
2018/09/18 Javascript
8 个有用的JS技巧(推荐)
2019/07/03 Javascript
Vue引入Stylus知识点总结
2020/01/16 Javascript
[01:54]TI4西雅图DOTA2选手欢迎晚宴 现场报道
2014/07/08 DOTA
python递归查询菜单并转换成json实例
2017/03/27 Python
Python 按字典dict的键排序,并取出相应的键值放于list中的实例
2019/02/12 Python
Python网络爬虫之爬取微博热搜
2019/04/18 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
如何在Cloud Studio上执行Python代码?
2019/08/09 Python
Python 利用高德地图api实现经纬度与地址的批量转换
2019/08/14 Python
利用python-docx模块写批量生日邀请函
2019/08/26 Python
Django项目中使用JWT的实现代码
2019/11/04 Python
Tensorflow 实现释放内存
2020/02/03 Python
Python中的整除和取模实例
2020/06/03 Python
python自动生成证件号的方法示例
2021/01/14 Python
shell程序中如何注释
2012/02/17 面试题
2014年协会工作总结
2014/11/22 职场文书
2015年小学生新年寄语
2014/12/08 职场文书
工程部经理岗位职责
2015/02/02 职场文书
留学推荐信(中英文版)
2015/03/26 职场文书
2015年党建工作汇报材料
2015/06/25 职场文书
2016年教师节特级教师获奖感言
2015/12/09 职场文书