MySQL系列11——索引效率测试
MySQL索引效率测试一、以mysql添加索引和不添加索引为例,测试数据的插入速度和查询速度。1、首先创建数据表和数据库,在cmd命令行中执行:create database TestDataSpeed charset=utf8;use testdataspeed;create table DataNoIndex(id int,name char(10),age int,address char(
·
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、比较查询速度
-
比较查询所有数据的速度
无索引情况:
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)
-
比较使用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)
可以看到,在添加索引之后,使用主键进行查询时,速度得到了显著提升。
-
比较使用非索引键查询的速度
无索引的情况:
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)
可以看到,在有索引的表中,即使不使用索引的字段进行查询,查询速度依然优于无索引的表,只是效率提升相对较少。
-
向有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)
查询速度有了显著的提升,这就是索引的优点,当数据越大时,提升的效果越明显。
更多推荐
已为社区贡献2条内容
所有评论(0)