欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Mysql中MyISAM、InnoDB中count效率的第一次简单测试

程序员文章站 2022-03-09 20:38:50
数据准备1、在mysql数据库的一个database中创建表students,设置存储引擎为MyISAM,不设置主键和任何索引create table students(id int,name varchar(100),age int,address varchar(100)) engine=MyISAM;2、在mysql数据库的其他database中创建表students,设置存储引擎为INNODB,不设置主键和任何索引create table students(id int,name varch...

数据准备

1、在mysql数据库的一个database中创建表students,设置存储引擎为MyISAM,不设置主键和任何索引
create table students(id int,name varchar(100),age int,address varchar(100)) engine=MyISAM;

2、在mysql数据库的其他database中创建表students,设置存储引擎为INNODB,不设置主键和任何索引
create table students(id int,name varchar(100),age int,address varchar(100)) engine=INNODB;

3、向students表中插入10万条数据(我是用python插入的)

import pymysql
import random

myconnect=pymysql.connect(host="127.0.0.1",
                          user="root",
                          password="123456a?",
                          database="learn")
list_value=[]
list_name=['小明','美美','超级小甜心','我是一个粉刷匠']
list_address=['北京','上海','青岛','成都','哈尔滨']
for id in range(1,1000001):
    name=random.choice(list_name)+"_%07d"%id
    age=random.randint(18,22)
    address=random.choice(list_address)
    list_value.append([id,name,age,address])

with myconnect.cursor() as cursor:
    sql1="insert into students values(%s,%s,%s,%s)"
    cursor.executemany(sql1,list_value)

myconnect.commit()

MyISAM测试

1.1、MyISAM表中,未设置索引时,count(*),count(1),count(column_name)的效率如何,三者有何区别?
Mysql中MyISAM、InnoDB中count效率的第一次简单测试

count(*):超级快,马上显示结果,是因为MyISAM存储引擎会专门存储表的总行数,所以每次查询时直接将结果显示即可。

count(1):超级快,因为count(1)和count(*)的原理是一样的

count(column_name):很慢,因为要将所有记录扫描一遍才能出结果。

备注:虽然在本例中看上去count(name)也是100000个结果,但如果某一个记录里name有空值的话,count(name)的结果就是99999,要去除空值。而count(*)和count(1)则仍然是100000

1.2、MyISAM表中,未设置索引时,同样是count(*),加入where条件后,查询的效率区别?
Mysql中MyISAM、InnoDB中count效率的第一次简单测试
加了where语句的查询会变得很慢,因为要全盘扫描。

1.3、MyISAM表中,添加索引后,再进行数据查询

create index index_name on students(name);

然后进行数据查询:
Mysql中MyISAM、InnoDB中count效率的第一次简单测试
select count(name) form students语句,无索引时使用5.89秒,为name列加了索引后使用0.36秒
select count(*) from students where name like"%小%"语句,无索引时使用5.82秒,为name列加了索引后使用0.49秒
从结果上看,速度还是快了很多。
本次测试仅10万条数据,当数据量更大,到了百万千万级别时候,使用索引后的查询效率就更加明显了。

INNODB测试

2.1、Innodb表中,未设置索引时,count(*),count(1),count(column_name)的效率如何,三者有何区别?
Mysql中MyISAM、InnoDB中count效率的第一次简单测试
好像没啥太大的区别。
Innodb表不会存储该表的总行数,所以count(*)的话是要全盘扫描。但count(column_name)的速度更快一点,不知道是不是innodb为列加了默认的hash索引?我也不太懂,看过别人的文章大概猜的,这个还待了解。

2.2、Innodb表中,未设置索引时,同样是count(*),加入where条件后,查询的效率区别?
Mysql中MyISAM、InnoDB中count效率的第一次简单测试
好像没啥太大的区别。有where语句反而更快?

2.3、Innodb表中,为name列添加索引后,再进行数据查询
Mysql中MyISAM、InnoDB中count效率的第一次简单测试
速度和之前比并没有明显的变化。

关于mysql的索引,后续还需要进一步了解啊,加油吧!

本文地址:https://blog.csdn.net/weixin_45580903/article/details/108998020

相关标签: 数据库 mysql