MySql深入浅出系列二 索引Index


什么是索引

索引类似大学图书馆建书目索引,可以提高数据检索的效率,降低数据库的IO成本。MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的。MySQL提供了Explain,用于显示SQL执行的详细信息,可以进行索引的优化。

不使用索引程序运行的时间

先向user表插入10w条数据

i = 1
while i < 100000:
    i += 1
    sql = """insert into user(user_name, user_appid) values("张三", %d)""" % i
    cursor.execute(sql)
    conn.commit()

查询数据

start = time.time()
sql = """select user_name, user_appid from user where user_appid = 97997"""
cursor.execute(sql)
print(cursor.fetchone())
end = time.time()
print(str(end-start))
cursor.close()
conn.close()
# 程序运行需要:0.018855810165405273

添加索引的方式

普通创建

CREATE INDEX indexName ON table_name (column_name(length))

如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。

修改表结构创建

ALTER table tableName ADD INDEX indexName(columnName)

创建表的时候直接创建

CREATE TABLE mytable(  
ID INT NOT NULL,   
username VARCHAR(16) NOT NULL,  
INDEX [indexName] (username(length))  
);  

创建索引后程序运行的时间

start = time.time()
sql = """select user_name, user_appid from user where user_appid = 97997"""
cursor.execute(sql)
print(cursor.fetchone())
end = time.time()
print(str(end-start))
# 程序运行需要:0.0020008087158203125

对比两组查询。可知结果快了很多倍!查询性能得到了优化,数据越多差距越大

END

索引虽然可以明显提高某些字段的查询效率。但是不要滥用,建立太多的索引将会影响更新和插入的速度,因为它需要同样更新每个索引文件。对于一个经常需要更新和插入的表格,就没有必要为一个很少使用的where字句单独建立索引了,对于比较小的表,排序的开销不会很大,也没有必要建立另外的索引。索引也会占用磁盘空间(财大气粗的可以忽略不计)

声明:游延东的博客|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - MySql深入浅出系列二 索引Index


为你,千千万万遍。