mysql千万级数据量根据索引优化查询速度的实现

 更新时间:2021年03月15日 14:27:33   作者:李秀才  
这篇文章主要介绍了mysql千万级数据量根据索引优化查询速度的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

(一)索引的作用

索引通俗来讲就相当于书的目录,当我们根据条件查询的时候,没有索引,便需要全表扫描,数据量少还可以,一旦数据量超过百万甚至千万,一条查询sql执行往往需要几十秒甚至更多,5秒以上就已经让人难以忍受了。

能在软件上解决的,就不在硬件上解决,毕竟硬件提升代码昂贵,性价比太低。代价小且行之有效的解决方法就是合理的加索引。索引使用得当,能使查询速度提升上千倍,效果惊人。

(二)mysql的索引类型:

mysql的索引有5种:主键索引、普通索引、唯一索引、全文索引、聚合索引(多列索引)。

唯一索引和全文索引用的很少,我们主要关注主键索引、普通索引和聚合索引。

1)主键索引:主键索引是加在主键上的索引,设置主键(primary key)的时候,mysql会自动创建主键索引;

2)普通索引:创建在非主键列上的索引;

3)聚合索引:创建在多列上的索引。

(三)索引的语法:

查看某张表的索引:show index from 表名;

创建普通索引:alter table 表名 add index  索引名 (加索引的列) 

创建聚合索引:alter table 表名 add index  索引名 (加索引的列1,加索引的列2) 

删除某张表的索引:drop index 索引名 on 表名;

(四)性能测试

测试环境:博主工作用台式机

处理器为Intel Core i5-4460 3.2GHz;

内存8G;

64位windows。

1:创建一张测试表

DROP TABLE IF EXISTS `test_user`;
CREATE TABLE `test_user` (
 `id` bigint(20) PRIMARY key not null AUTO_INCREMENT,
 `username` varchar(11) DEFAULT NULL,
 `gender` varchar(2) DEFAULT NULL,
 `password` varchar(100) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

存储引擎使用MyISAM是因为此引擎没有事务,插入速度极快,方便我们快速插入千万条测试数据,等我们插完数据,再把存储类型修改为InnoDB。

2:使用存储过程插入1千万条数据

create procedure myproc() 
begin 
declare num int; 
set num=1; 
while num <= 10000000 do 
insert into test_user(username,gender,password) values(num,'保密',PASSWORD(num)); 
set num=num+1;
end while;
 end
call myproc();

由于使用的MyISAM引擎,插入1千万条数据,仅耗时246秒,若是InnoDB引擎,就要花费数小时了。

然后将存储引擎修改回InnDB。使用如下命令:  alter table test_user engine=InnoDB;此命令执行时间大约耗时5分钟,耐心等待。

tips:这里是测试,生产环境中不要随意修改存储引擎,还有alter table 操作,会锁整张表,慎用。其次:myisam引擎没有事务,且只是将数据写到内存中,然后定期将数据刷出到磁盘上,因此突然断电的情况下,会导致数据丢失。而InnDB引擎,是将数据写入日志中,然后定期刷出到磁盘上,所以不怕突然断电等情况。因此在实际生产中能用InnDB则用。

3:sql测试

select id,username,gender,password from test_user where id=999999

耗时:0.114s。

因为我们建表的时候,将id设成了主键,所以执行此sql的时候,走了主键索引,查询速度才会如此之快。

我们再执行select id,username,gender,password from test_user where username='9000000'
耗时:4.613s。

我们给username列加上普通索引。

ALTER TABLE `test_user` ADD INDEX index_name(username) ;

此过程大约耗时 54.028s,建索引的过程会全表扫描,逐条建索引,当然慢了。

再来执行:selectid,username,gender,password from test_user where username='9000000'
耗时:0.043s。

再用username和password来联合查询

select id,username,gender,password from test_user where username='9000000' and `password`='*3A70E147E88D99888804E4D472410EFD9CD890AE'

此时虽然我们队username加了索引,但是password列未加索引,索引执行password筛选的时候,还是会全表扫描,因此此时

查询速度立马降了下来。

耗时:4.492s。

当我们的sql有多个列的筛选条件的时候,就需要对查询的多个列都加索引组成聚合索引:

加上聚合索引:ALTER TABLE `test_user` ADD INDEX index_union_name_password(username,password)
再来执行:

耗时:0.001s。

开篇也说过软件层面的优化一是合理加索引;二是优化执行慢的sql。此二者相辅相成,缺一不可,如果加了索引,还是查询很慢,这时候就要考虑是sql的问题了,优化sql。

Tips:

1:加了索引,依然全表扫描的可能情况有:

索引列为字符串,而没带引号;

索引列没出现在where条件后面;

索引列出现的位置没在前面。

2:关联查询不走索引的可能情况有:

关联的多张表的字符集不一样;

关联的字段的字符集不一样;

存储引擎不一样;

字段的长度不一样。

到此这篇关于mysql千万级数据量根据索引优化查询速度的实现的文章就介绍到这了,更多相关mysql千万级索引优化查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • zabbix监控mysql的实例方法

    zabbix监控mysql的实例方法

    在创建监控项之前要尽量考虑清楚要监控什么,怎么监控,监控数据如何存储,监控数据如何展现,如何处理报警等。本文主要介绍了zabbix监控mysql的实现方法,感兴趣的可以了解一下
    2021-06-06
  • 在MySQL中使用序列的简单教程

    在MySQL中使用序列的简单教程

    这篇文章主要介绍了在MySQL中使用序列的简单教程,是MySQL入门学习中的基础知识,文中给出了基于PHP和Perl脚本的示例,需要的朋友可以参考下
    2015-05-05
  • Mysql数据库时间与系统时间不一致问题排查及解决

    Mysql数据库时间与系统时间不一致问题排查及解决

    最近忽然发现个问题,Mysql数据库时间与系统时间不一致,通过查找相关资料终于解决了,下面这篇文章主要给大家介绍了关于Mysql数据库时间与系统时间不一致问题排查及解决的相关资料,需要的朋友可以参考下
    2023-06-06
  • centos7下mysqldump定时备份数据库的方法实现

    centos7下mysqldump定时备份数据库的方法实现

    MySQL Dump是MySQL提供的方便导出数据库数据的工具,本文主要介绍了centos7下mysqldump定时备份数据库的方法实现,感兴趣的可以了解一下
    2023-08-08
  • mysql 8.0.11安装配置方法图文教程

    mysql 8.0.11安装配置方法图文教程

    这篇文章主要为大家详细介绍了mysql 8.0.11安装配置方法图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • MySQL之存储过程按月创建表的方法步骤

    MySQL之存储过程按月创建表的方法步骤

    这篇文章主要介绍了MySQL之存储过程按月创建表的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • pt-kill 常用杀进程参数介绍

    pt-kill 常用杀进程参数介绍

    这篇文章主要介绍了pt-kill 常用杀进程参数介绍,需要的朋友可以参考下
    2016-04-04
  • mybatis 模糊查询的实现方法

    mybatis 模糊查询的实现方法

    这篇文章主要介绍了mybatis 模糊查询的实现方法的相关资料,希望通过本文能帮助到大家,让大家掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • 详解MySQL中的基本表与视图

    详解MySQL中的基本表与视图

    Mysql是一种常用的关系型数据库管理系统,其中的基本表和视图是数据库中存储和操作数据的两种重要方式,本文将介绍什么是基本表和视图,并探讨为何要使用视图以及视图的优缺点,最后,将给出在Mysql中创建视图的方法,需要的朋友可以参考下
    2023-09-09
  • MySQL中LIKE运算符的多种使用方式及示例演示

    MySQL中LIKE运算符的多种使用方式及示例演示

    无论是简单的模式匹配还是复杂的模式匹配,LIKE运算符都提供了强大的功能来满足不同的匹配需求,通过本文的介绍,我们详细了解了在MySQL数据库中使用LIKE运算符进行模糊匹配的多种方式,感兴趣的朋友跟随小编一起看看吧
    2023-07-07

最新评论