MySQL系列11——索引效率测试

2023-11-08

MySQL索引效率测试

一、以mysql添加索引和不添加索引为例,测试数据的插入速度和查询速度。

1、首先创建数据表和数据库,在cmd命令行中执行:
create database TestDataSpeed charset=utf8;
use testdataspeed;
create table DataNoIndex(id int,name char(10),age int,address char(20),gender char(1)); #创建不带索引的数据表
create table DataNoIndex(id int primary key autoincrement,name char(10),age int,address char(20),gender char(1));  # 创建带主键索引的数据表
2、创建完数据库之后,使用pymysql操作分别插入1000万条数据:

首先分别向无索引和有索引的表中插入数据,在无索引的表中插入1000万条数据共耗时1134秒,在有索引的表中插入共耗时1138秒,插入数据时耗用时间相差不大。:

# -*- coding: utf-8 -*-
import pymysql
import time
from functools import wraps
import random
import traceback

def timer(func):
    @wraps(func)
    def inner(*args):
        start_time = time.time()
        func(*args)
        end_time = time.time()
        print(end_time-start_time)
    return inner

@timer
def insert_no_index(*args):
    try:
        db = pymysql.connect(user=user,password=password,database="testdataspeed")
        cursor = db.cursor()
        for i in range(1,10*1000*1000):
            age = random.randint(10,25)
            gender = random.choice(["男","女"])
            address = random.choice(["北京","上海","广州","杭州","深圳","成都","重庆"])
            sql = "INSERT INTO DATANOINDEX VALUE('{}','{}','{}','{}','{}');".format(i,"小明"+str(i),age,address,gender)
            # print(sql)
            cursor.execute(sql)
        db.commit()
        db.close()
    except:
        print(traceback.format_exc())

if __name__ == '__main__':
    user = "root"
    password = "root"
    insert_no_index(user,password)
3、比较查询速度
  1. 比较查询所有数据的速度

    无索引情况:

    mysql> select count(gender) from datanoindex;
    +---------------+
    | count(gender) |
    +---------------+
    |       9999999 |
    +---------------+
    1 row in set (7.67 sec)
    

    有索引情况:

    mysql> select count(gender) from dataindex;
    +---------------+
    | count(gender) |
    +---------------+
    |       9999999 |
    +---------------+
    1 row in set (6.42 sec)
    
  2. 比较使用where查询主键条件的速度

    无索引情况:

    mysql> select *  from datanoindex where id=1000;
    +------+----------+------+---------+--------+
    | id   | name     | age  | address | gender |
    +------+----------+------+---------+--------+
    | 1000 | 小明1000 |   25 | 广州    | 男     |
    +------+----------+------+---------+--------+
    1 row in set (8.10 sec)
    

    有索引情况:

    mysql> select * from dataindex where id=1000;
    +------+----------+------+---------+--------+
    | id   | name     | age  | address | gender |
    +------+----------+------+---------+--------+
    | 1000 | 小明1000 |   22 | 北京    | 男     |
    +------+----------+------+---------+--------+
    1 row in set (0.00 sec)
    

    可以看到,在添加索引之后,使用主键进行查询时,速度得到了显著提升。

  3. 比较使用非索引键查询的速度

    无索引的情况:

    mysql> select *  from datanoindex where name="小明1000";
    +------+----------+------+---------+--------+
    | id   | name     | age  | address | gender |
    +------+----------+------+---------+--------+
    | 1000 | 小明1000 |   25 | 广州    | 男     |
    +------+----------+------+---------+--------+
    1 row in set (8.95 sec)
    

    有索引情况:

    mysql> select * from dataindex where name="小明1000";
    +------+----------+------+---------+--------+
    | id   | name     | age  | address | gender |
    +------+----------+------+---------+--------+
    | 1000 | 小明1000 |   22 | 北京    | 男     |
    +------+----------+------+---------+--------+
    1 row in set (7.15 sec)
    

    可以看到,在有索引的表中,即使不使用索引的字段进行查询,查询速度依然优于无索引的表,只是效率提升相对较少。

  4. 向有1000万数据的表中添加主键索引

    向无索引的表中添加主键索引,测试需要花费的时间。

    mysql> alter table datanoindex add primary key(id);
    Query OK, 0 rows affected (2 min 45.44 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    

    大约两分钟45秒可以把索引建立完成。此时再使用主键进行查询:

    mysql> select * from datanoindex where id=100000;
    +--------+------------+------+---------+--------+
    | id     | name       | age  | address | gender |
    +--------+------------+------+---------+--------+
    | 100000 | 小明100000 |   19 | 成都    | 女     |
    +--------+------------+------+---------+--------+
    1 row in set (0.10 sec)
    

    查询速度有了显著的提升,这就是索引的优点,当数据越大时,提升的效果越明显。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL系列11——索引效率测试 的相关文章

  • 选择每组最新的项目[重复]

    这个问题在这里已经有答案了 可能的重复 检索每组中的最后一条记录 https stackoverflow com questions 1313120 retrieving the last record in each group 我有 2
  • MySQL 查询中的窗口函数

    有没有办法在 SELECT 查询本身中动态地使用 MySQL 查询中的窗口函数 我知道在 PostgreSQL 中这是可能的 例如 下面是 PostgreSQL 中的等效查询 SELECT c server ip c client ip s
  • pyodbc 无法正确处理 unicode 数据

    我确实使用 pyodbc 成功连接了 MySQL 数据库 并且它可以很好地处理 ascii 编码的数据 但是当我打印使用 unicode utf8 编码的数据时 它引发了错误 UnicodeEncodeError ascii codec c
  • 通过字符串操作预防 PHP SQL 注入[重复]

    这个问题在这里已经有答案了 可能的重复 PHP 中防止 SQL 注入的最佳方法 https stackoverflow com questions 60174 best way to prevent sql injection in php
  • 通过 PDO 将双精度数插入 MySQL 时精度损失

    我遇到了这种非常烦人的行为 我想知道我是否做错了什么 或者这是否是故意的 如果是的话 为什么 每当我在 php 5 3 中有一个 double 类型的变量 并且想将其插入到数据库 MYSQL 5 0 的 double 类型字段中时 该值总是
  • 如何处理PDO异常[重复]

    这个问题在这里已经有答案了 我正在尝试与PDOphp 上的类 但我在找到处理错误的正确方法时遇到了一些麻烦 我编写了以下代码
  • 无法从 Web 主机本身以外的任何地方连接到任何 Web 主机的 MySQL 数据库

    我有 2 个不同的虚拟主机 pagodabox 000webhost 都是免费的 并且我已经设置了localhost与MySQL 我已经在他们三个上安装了 wordpress 它们在自己的域中工作得很好 即 什么时候localhostwor
  • PostgreSQL & regexp_split_to_array + 取消嵌套

    我有这样的绳子 测试1 纽约 X 测试 2 芝加哥 Y 测试 3 宾夕法尼亚州哈里斯堡 Z 我需要的结果是 Column1 Column 2 Column3 Test 1 new york X Test 2 chicago Y Test 3
  • oracle lag 函数与 group by

    我有一个查询忽略从前一个值增加的值 例如 采用下表 col1 col2 col3 5 1 A 4 2 A 6 3 A 9 4 B 8 5 B 10 6 B 现在进行以下查询 select col1 from select col1 lag
  • SQL查询获取最后两条记录的DateDiff

    我有一个名为 Event 的表 其中 eventNum 作为主键 日期作为 SQL Server 2008 R2 中的 datetime2 7 我试图获取表中最后两行的日期并以分钟为单位获取差异 这就是我目前所拥有的 Select DATE
  • MySQL 将表的校验和存储在另一个表中

    语境 我们有包含大量表的大型数据库 他们中的大多数 99 都使用innodb 我们希望有一个日常流程来监视哪个表已被修改 当他们使用 innodb 的值时Update time from SHOW table STATUS from inf
  • Chart.js - 使用 mysql 和 php 从数据库获取数据

    我正在尝试将静态数据转换为使用数据库结果 我将使用MySQL and PHP 示例代码 var randomScalingFactor function return Math round Math random 100 var lineC
  • 如何将变量设置为触发器 MYSQL 内存储过程的结果?

    我这里有一个小问题 我正在为我的数据库工作创建一个触发器 但我不知道如何在触发器内使用存储过程 我想将过程的结果保存在变量中 然后使用稍后在 IF 比较器上变量 这是我的代码 DELIMITER CREATE TRIGGER insert
  • If Else 条件的 SQLite 语法

    我正在使用 SQLite 数据库 我的表有一个名为 密码 的文本列 早些时候 为了检索我用来执行简单操作的值select from myTable询问 但现在的要求是 如果Password值不是NULL那么我需要将其显示为 是 或 否 它是
  • 使用多个 WHERE 子句更新 Codeigniter 中的批次

    我查看了 CI 用户指南来了解如何处理update batch 并且它似乎只接受一个索引来匹配要更新的行 但在我的例子中 我需要指定两个索引 例如lang and id page我一起用作索引 这样的lang en id page 115是
  • 从 $i 获取值,顺序被打乱

    for i 0 i lt count name i some output ommited td td
  • 当php脚本通过ajax运行时显示进度条

    我有一个通过 ajax 向服务器提交值的表单
  • SQL Server查询麻烦,多对多关系

    不知道如何用一行字来表达这个问题 对标题表示歉意 我的数据库中有3个表 例如 Shop Item 商店库存 Shop 和 Item 具有多对多关系 因此 ShopStock 表将它们链接起来 ShopStock 中的字段是 ID ShopI
  • mysql_query 保留返回时在表中创建的数据类型?

    我在mysql中有一个表 CREATE TABLE user id INT name VARCHAR 250 我查询表 result mysql query SELECT id name FROM user 我收集结果 while row
  • Unicode(希腊语)字符存储在数据库中,例如“??????”

    数据库中的希腊字符就像问号 我找不到解决办法 我使用 Java Swing 开发了一个应用程序 但是当我在 MySQL 中插入希腊字母时 就像问号一样 我将数据库排序规则更改为 utf8 并将列也更改为 utf8 我的项目编码设置为UTF

随机推荐

  • 高德地图----在vue中使用了vue-amap给信息窗口增加点击事件和样式【vue】【vue-amp】

    在vue中使用了vue amap给信息窗口增加点击事件和样式 在vue amap中给信息窗口增加点击事件content属性是不行了 template又一直报错 那怎么办呢 当然是简单便捷的slot啦 直接上代码
  • Hyperledger Fabric 链码启动过程实现

    注 本文最早发表于 2017 09 22 Hyperledger 源码分析之 Fabric 简介 这里讲的 Chaincode 是用户链码 User Chaincode UCC 对应用开发者来说十分重要 它提供了基于区块链分布式账本的状态处
  • Python爬虫批量访问突破访问限制封禁的方法

    坑述 数据采集常用的方法是写一个爬虫程序向网络服务器请求数据 通常是用HTML表单或其他网页文件 然后对数据进行解析 提取需要的信息 然而 批量访问时会有访问限制 更会认为频繁访问是恶意攻击 对ip进行封禁 导致我们的爬虫程序被终止 tim
  • 【css】动画:立方体相册

  • 热词科普--关于前后端分离的易懂解析

    目录 一 什么是前后端分离 二 为什么要前后端分离 未分离时期 工作方式 半分离时期 三 前后端分离的优点 四 前后端分离的缺点 五 什么场景下可以考虑前后端分离 六 基于Vue Springboot的前后端分离 Spring Boot 简
  • 小程序上传图片报uploadFile:fail parameter error: parameter.filePat…parameter.name should be String instead o

    小程序上传图片报uploadFile fail parameter error parameter filePat parameter name should be String instead of Array 阐述 原因是上传的name
  • nodejs + pkg+ puppeteer 路径问题以及 Passed function is not well-serializable 问题

    最近在使用 puppeteer 写自动化程序 发现几个问题在这里吧解决方案分享给大家 pkg 打包后的路径问题 具体路径详情看 https blog csdn net u012211003 article details 112872859
  • jQuery Dialog 弹出层对话框插件演示

    原文地址 http blog csdn net fer ba article details 7067352 dialog jquery function iframe class filter 目录 基本操作 默认的 html view
  • 【Java比较学习】重写equals方法的安全写法

    重写equals方法的正确打开方式 正文开始 Assassin 目录 重写equals方法的正确打开方式 1 什么是equals方法 1 1 equals方法 2 为什么要重写equals方法 2 1 举个例子吧 3 分析equals源码
  • linux运维ansible入门

    bilibili视频地址 ansible入门 介绍 无主无从 开箱即用 用完就走 只要能用ssh即可使用ansible 总结 分成两部分 主机 ansible 模块 主机清单 ssh playbook 完成复杂部署 使用yum安装 ansi
  • Vite和webpack区别

    Vite 和 Webpack 都是前端构建工具 Vite 是一个基于 ES modules 的构建工具 而 Webpack 则是一个 Web 应用程序的静态模块打包器 以下是 Vite 和 Webpack 之间的一些区别 构建方式 Vite
  • 微信小程序:wx.getUserInfo()获取用户信息报错

    在使用wx getUserInfo 来获取用户相关信息报错失败 为优化用户体验 使用 wx getUserInfo 接口直接弹出授权框的开发方式将逐步不再支持 从2018年4月30日开始 小程序与小游戏的体验版 开发版调用 wx getUs
  • 微服务架构的核心要点和实现原理

    摘要 本文中 我们将进一步理解微服务架构的核心要点和实现原理 为读者的实践提供微服务的设计模式 以期让微服务在读者正在工作的项目中起到积极的作用 微服务架构中职能团队的划分 传统单体架构将系统分成具有不同职责的层次 对应的项目管理也倾向于将
  • 2023备战金三银四,Python自动化软件测试面试宝典合集(六)

    马上就又到了程序员们躁动不安 蠢蠢欲动的季节 这不 金三银四已然到了家门口 元宵节一过后台就有不少人问我 现在外边大厂面试都问啥 想去大厂又怕面试挂 面试应该怎么准备 测试开发前景如何 面试 一个程序员成长之路永恒绕不过的话题 每每到这个时
  • 最小树形图的环收缩

    气死我了 最近学习关于最小树形图的问题 无论是CSDN还是博客园 真就是天下文章一大抄 图都用一模一样的 又复杂又高糊 我只是想搞懂存在环 这个环是怎么收缩的 结果给我看了屎一样图和文字表达 一气之下 写一个短文好还描述一下环是怎么收缩成点
  • AttributeError: ‘NoneType‘ object has no attribute ‘xxx‘v

    分析 在Python中 NoneType是一个类型 如同int float一样 如 gt gt gt a None gt gt gt type a
  • vi如何使用

    个人发现好多企业内部运维工程师 很少有人懂得VI的使用技巧 通常都是一顿按 上下左右键 搞得我好郁闷 我本人整理了一份VI的使用技巧分享下 希望大家正确 高效 去工作 Vi 1 Vi 10 进入Vi 以第10行为行首 2 Vi 空格 最后一
  • 以太坊学习笔记:私有链搭建操作指南

    原文链接 https my oschina net u 2349981 blog 865256 讲解的内容非常详细 熟悉搭建以太坊私有链的相关操作 学习了 摘要 详解以太坊私有链搭建过程以及一些常用的操作 虽然以太坊是一个公有链系统 但是我
  • 学算法,先从二分查找开始吧

    总纲 思路很简单 细节是魔鬼 分为三个常用场景 寻找一个数 寻找左侧边界 寻找右侧边界 最后给出力扣上的题目例子 还可以在GitHub上观看哦 AlgorithmNotes 基础框架 int binarySearch int nums in
  • MySQL系列11——索引效率测试

    MySQL索引效率测试 一 以mysql添加索引和不添加索引为例 测试数据的插入速度和查询速度 1 首先创建数据表和数据库 在cmd命令行中执行 create database TestDataSpeed charset utf8 use