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 相关文章推荐
数据库的高级查询六:表连接查询:外连接(左外连接,右外连接,UNION关键字,连接中ON与WHERE的不同)
Apr 05 MySQL
解读MySQL的客户端和服务端协议
May 10 MySQL
MySQL 使用自定义变量进行查询优化
May 14 MySQL
MySQL触发器的使用
May 24 MySQL
MySQL 十大常用字符串函数详解
Jun 30 MySQL
MySQL系列之十二 备份与恢复
Jul 02 MySQL
SQL IDENTITY_INSERT作用案例详解
Aug 23 MySQL
MySQL中varchar和char类型的区别
Nov 17 MySQL
MySQL利用UNION连接2个查询排序失效详解
Nov 20 MySQL
MySQL常见优化方案汇总
Jan 18 MySQL
mysql insert 存在即不插入语法说明
Mar 25 MySQL
MySQL分区以及建索引的方法总结
Apr 13 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树的代码,可以嵌套任意层
2006/10/09 PHP
基于header的一些常用指令详解
2013/06/06 PHP
详解PHP中strlen和mb_strlen函数的区别
2014/03/07 PHP
Laravel项目中timeAgo字段语言转换的改善方法示例
2019/09/16 PHP
JavaScript版DateAdd和DateDiff函数代码
2012/03/01 Javascript
javascript中call和apply的用法示例分析
2015/04/02 Javascript
基于jquery实现轮播特效
2016/04/22 Javascript
js控制div层的叠加简单方法
2016/10/15 Javascript
jQuery图片轮播功能实例代码
2017/01/29 Javascript
JavaScript 中 JSON.parse 函数 和 JSON.stringify 函数
2018/12/05 Javascript
原生JS实现京东查看商品点击放大
2020/12/21 Javascript
Nodejs 数组的队列以及forEach的应用详解
2021/02/25 NodeJs
[02:57]DOTA2英雄基础教程 风行者
2014/01/16 DOTA
python fabric实现远程操作和部署示例
2014/03/25 Python
浅谈Python 中整型对象的存储问题
2016/05/16 Python
Python使用PIL模块生成随机验证码
2017/11/21 Python
Pandas 数据处理,数据清洗详解
2018/07/10 Python
Python 使用类写装饰器的小技巧
2018/09/30 Python
对python制作自己的数据集实例讲解
2018/12/12 Python
解决Pycharm界面的子窗口不见了的问题
2019/01/17 Python
python实现图片中文字分割效果
2019/07/22 Python
Python闭包与装饰器原理及实例解析
2020/04/30 Python
Python 使用双重循环打印图形菱形操作
2020/08/09 Python
Pandas DataFrame求差集的示例代码
2020/12/13 Python
一款纯css3实现的圆形旋转分享按钮旋转角度可自己调整
2014/09/02 HTML / CSS
CSS3 实现倒计时效果
2020/11/25 HTML / CSS
html5 canvas合成海报所遇问题及解决方案总结
2017/08/03 HTML / CSS
详解webapp页面滚动卡顿的解决办法
2018/12/26 HTML / CSS
ProBikeKit英国:在线公路自行车之家
2017/02/10 全球购物
印度尼西亚手表和包包商店:Urban Icon
2019/12/12 全球购物
学前班评语大全
2014/05/04 职场文书
学生自我鉴定格式及范文
2014/09/16 职场文书
公务员党的群众路线教育实践活动学习心得体会
2014/10/30 职场文书
工程资料员岗位职责
2015/04/13 职场文书
让人瞬间清醒的句子,句句经典,字字如金
2019/07/08 职场文书
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL