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 22 MySQL
MySQL数据迁移相关总结
Apr 29 MySQL
MySql学习笔记之事务隔离级别详解
May 12 MySQL
浅谈mysql执行过程以及顺序
May 12 MySQL
MySQL 使用事件(Events)完成计划任务
May 24 MySQL
Mysql数据库命令大全
May 26 MySQL
SQL之各种join小结详细讲解
Aug 04 MySQL
浅谈MySQL函数
Oct 05 MySQL
MySQL学习必备条件查询数据
Mar 25 MySQL
排查MySQL生产环境索引没有效果
Apr 11 MySQL
MySQL索引 高效获取数据的数据结构
May 02 MySQL
MySQL 计算连续登录天数
May 11 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
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
Php header()函数语法及使用代码
2013/11/04 PHP
php转换颜色为其反色的方法
2015/04/27 PHP
基于php实现的php代码加密解密类完整实例
2016/10/12 PHP
PHP中危险的file_put_contents函数详解
2017/11/04 PHP
Javascript的数组与字典用法与遍历对象的属性技巧
2012/11/07 Javascript
深入document.write()与HTML4.01的非成对标签的详解
2013/05/08 Javascript
javaScript 页面自动加载事件详解
2014/02/10 Javascript
浅谈Jquery为元素绑定事件
2015/04/27 Javascript
jQuery简单实现日历的方法
2015/05/04 Javascript
js窗口关闭提示信息(兼容IE和firefox)
2015/10/23 Javascript
JavaScript隐式类型转换
2016/03/15 Javascript
使用 stylelint检查CSS_StyleLint
2016/04/28 Javascript
js与jquery正则验证电子邮箱、手机号、邮政编码的方法
2016/07/04 Javascript
详解Angular Reactive Form 表单验证
2017/07/06 Javascript
小程序显示弹窗时禁止下层的内容滚动实现方法
2019/03/20 Javascript
详解关于React-Router4.0跳转不置顶解决方案
2019/05/10 Javascript
ionic4+angular7+cordova上传图片功能的实例代码
2019/06/19 Javascript
jQuery pager.js 插件动态分页功能实例分析
2019/08/02 jQuery
[01:32:22]DOTA2-DPC中国联赛 正赛 Ehome vs VG BO3 第一场 2月5日
2021/03/11 DOTA
python使用socket向客户端发送数据的方法
2015/04/29 Python
python 添加用户设置密码并发邮件给root用户
2016/07/25 Python
Python数据类型之列表和元组的方法实例详解
2019/07/08 Python
Python 的AES加密与解密实现
2019/07/09 Python
详解pycharm自动import所需的库的操作方法
2020/11/30 Python
详解Python模块化编程与装饰器
2021/01/16 Python
在浏览器端如何得到服务器端响应的XML数据
2012/11/24 面试题
领导干部培训感言
2014/01/23 职场文书
办公室岗位职责
2014/02/12 职场文书
班级标语大全
2014/06/21 职场文书
幼儿园园长个人总结
2015/03/02 职场文书
一文帮你理解PReact10.5.13源码
2021/04/03 Javascript
HTML页面滚动时部分内容位置固定不滚动的实现
2021/04/14 HTML / CSS
python opencv旋转图片的使用方法
2021/06/04 Python
FP-growth算法发现频繁项集——发现频繁项集
2021/06/24 Python
浅谈哪个Python库才最适合做数据可视化
2021/06/28 Python