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 14 MySQL
教你解决往mysql数据库中存入汉字报错的方法
May 06 MySQL
详解MySQL 联合查询优化机制
May 10 MySQL
mysql 带多个条件的查询方式
Jun 05 MySQL
解析MySQL binlog
Jun 11 MySQL
Mysql数据库按时间点恢复实战记录
Jun 30 MySQL
mysql 索引合并的使用
Aug 30 MySQL
MySQL中order by的使用详情
Nov 17 MySQL
MySQ InnoDB和MyISAM存储引擎介绍
Apr 26 MySQL
深入理解MySQL中MVCC与BufferPool缓存机制
May 25 MySQL
MySQL数据库如何查看表占用空间大小
Jun 10 MySQL
MySQL生成千万测试数据以及遇到的问题
Aug 05 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
从C/C++迁移到PHP——判断字符类型的函数
2006/10/09 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
2014/10/30 PHP
使用PHP实现阻止用户上传成人照片或者裸照
2014/12/25 PHP
discuz目录文件资料汇总
2014/12/30 PHP
php打印一个边长为N的实心和空心菱型的方法
2015/03/02 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
2017/02/08 PHP
Laravel框架路由管理简单示例
2019/05/07 PHP
php利用array_search与array_column实现二维数组查找
2019/07/08 PHP
Alliance vs AM BO3 第一场2.13
2021/03/10 DOTA
JavaScript中“+=”的应用
2007/02/02 Javascript
解析js原生方法创建表格效率测试
2013/07/08 Javascript
jQuery对指定元素中指定字符串进行替换的方法
2015/03/17 Javascript
javascript实现简单的二级联动
2015/03/19 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
2015/04/01 Javascript
jquery任意位置浮动固定层插件用法实例
2015/05/29 Javascript
JQuery中DOM实现事件移除的方法
2015/06/13 Javascript
HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
2015/11/25 Javascript
JQuery查找子元素find()和遍历集合each的方法总结
2017/03/07 Javascript
angular框架实现全选与单选chekbox的自定义
2017/07/06 Javascript
javascript匿名函数中的'return function()'作用
2018/10/15 Javascript
Bootstrap实现模态框效果
2019/09/30 Javascript
vue element ui validate 主动触发错误提示操作
2020/09/21 Javascript
[01:35]2018完美盛典章节片——共竞
2018/12/17 DOTA
python任务调度实例分析
2015/05/19 Python
深入解析Python设计模式编程中建造者模式的使用
2016/03/02 Python
numpy数组拼接简单示例
2017/12/15 Python
python3.5+tesseract+adb实现西瓜视频或头脑王者辅助答题
2018/01/17 Python
彻底理解Python中的yield关键字
2019/04/01 Python
基于Python实现2种反转链表方法代码实例
2020/07/06 Python
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
办公室人员先进事迹
2014/01/27 职场文书
学习教师法的心得体会
2014/09/03 职场文书
小区门卫的岗位职责
2014/09/26 职场文书
工作骂脏话检讨书
2014/10/05 职场文书
2014年招生工作总结
2014/11/26 职场文书
导游词之晋城蟒河
2019/12/12 职场文书