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
mysql多表查询-笔记七
Apr 05 MySQL
mysql查询的控制语句图文详解
Apr 11 MySQL
MySQL删除和插入数据很慢的问题解决
Jun 03 MySQL
mysql定时自动备份数据库的方法步骤
Jul 07 MySQL
MySQL外键约束(FOREIGN KEY)案例讲解
Aug 23 MySQL
MySQL面试题讲解之如何设置Hash索引
Nov 01 MySQL
MySQL表类型 存储引擎 的选择
Nov 11 MySQL
MySQL优化常用的19种有效方法(推荐!)
Mar 17 MySQL
mysql性能优化以及配置连接参数设置
May 06 MySQL
MySQL查询日期时间
May 15 MySQL
MYSQL如何查看操作日志详解
May 30 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以ROOT权限执行系统命令的方法
2011/02/10 PHP
php 5.6版本中编写一个PHP扩展的简单示例
2015/01/20 PHP
使用jQuery获得内容以及内容的属性
2015/02/26 Javascript
JS实现先显示大图后自动收起显示小图的广告代码
2015/09/04 Javascript
JS实现带圆弧背景渐变效果的导航菜单代码
2015/10/13 Javascript
基于jquery实现动态竖向柱状条特效
2016/02/12 Javascript
jQuery Ajax 异步加载显示等待效果代码分享
2016/08/01 Javascript
jQuery插件FusionCharts绘制2D环饼图效果示例【附demo源码】
2017/04/10 jQuery
浅谈Node模块系统及其模式
2017/11/17 Javascript
nodejs项目windows下开机自启动的方法
2017/11/22 NodeJs
JavaScript引用类型RegExp基本用法详解
2018/08/09 Javascript
详解async/await 异步应用的常用场景
2019/05/13 Javascript
vue路由切换时取消之前的所有请求操作
2020/09/01 Javascript
Python开发编码规范
2006/09/08 Python
比较详细Python正则表达式操作指南(re使用)
2008/09/06 Python
python 生成不重复的随机数的代码
2011/05/15 Python
Python入门篇之字符串
2014/10/17 Python
python中argparse模块用法实例详解
2015/06/03 Python
python Socket之客户端和服务端握手详解
2017/09/18 Python
python3使用requests模块爬取页面内容的实战演练
2017/09/25 Python
对TensorFlow的assign赋值用法详解
2018/07/30 Python
Python使用指定端口进行http请求的例子
2019/07/25 Python
解决Python列表字符不区分大小写的问题
2019/12/19 Python
python数据预处理方式 :数据降维
2020/02/24 Python
基于keras中的回调函数用法说明
2020/06/17 Python
Pyinstaller打包Scrapy项目的实现步骤
2020/09/22 Python
需要知道的CSS3动画技术
2010/01/01 HTML / CSS
使用HTML5 Canvas绘制圆角矩形及相关的一些应用举例
2016/03/22 HTML / CSS
Bitiba意大利:在线宠物商店
2020/10/31 全球购物
大学四年职业生涯规划书范文
2014/01/02 职场文书
骨干教师培训制度
2014/01/13 职场文书
新课培训心得体会
2014/09/03 职场文书
冬季作息时间调整通知
2015/04/24 职场文书
2015年教师党员个人总结
2015/11/24 职场文书
经典励志格言:每日一句,让你每天充满能量
2019/08/16 职场文书
css如何把元素固定在容器底部的四种方式
2022/06/16 HTML / CSS