(一)索引的作用

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

提升查询速度的方向一是提升硬件(内存、cpu、硬盘),二是在软件上优化(加索引、优化sql;优化sql不在本文阐述范围之内)。

能在软件上解决的,就不在硬件上解决,毕竟硬件提升代码昂贵,性价比太低。代价小且行之有效的解决方法就是合理的加索引。

索引使用得当,能使查询速度提升上万倍,效果惊人。

(二)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引擎,插入100万条数据就要花费数小时了。

然后将存储引擎修改回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' or `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。

实际生产中的sql往往比较复杂,如果数据量过了百万,加了索引后效果还是不理想,使用集群。

Tips:

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

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

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

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

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

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

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

存储引擎不一样;

字段的长度不一样。

mysql千万级数据索引查询_mysql千万级数据量根据索引优化查询速度相关推荐

  1. mysql数值比中文检索快_MySQL 千万 级数据量根据(索引)优化 查询 速度

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

  2. qq空间代码查询_Mysql千万级大数据查询优化经验,一点课堂(多岸学院)

    提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意) 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避 ...

  3. mysql群删除记录查询_mysql那些招:执行大批量删除、查询和索引等操作

    类型:数据库类大小:1.7M语言:英文 评分:6.6 标签: 立即下载 mysql执行大批量删除 执行大批量删除的时候注意要使用上limit 因为如果不用limit,删除大量数据很有可能造成死锁 如果 ...

  4. mysql如何备份一个表单_Mysql亿级数据大表单表备份

    上一篇Mysql已有亿级数据大表按时间分区,介绍了亿级数据大表如何按时间分区,也留下了一个问题:备份亿级数据大表要耗时多久.本篇将就如何备份亿级数据大表展开讨论. 注意:我这里所说的备份指的是数据从一 ...

  5. mysql 事b务 查询_MySQL进阶学习笔记二(包括连接查询、子查询、联合查询、事务、存储过程)...

    1.高级查询 (1)了解笛卡尔积:笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X × Y,第一个对象是X的成员而第二个对象是Y的所有可能有序 ...

  6. mysql全文搜索实现模糊查询_mysql使用全文索引实现大字段的模糊查询

    0.场景说明 centos7 mysql5.7 InnoDB引擎 0.1创建表 DROP TABLE IF EXISTS tbl_article_content; CREATE TABLE tbl_a ...

  7. mysql删除索引语句_MySQL:使用SQL语句删除所有索引

    删除所有索引 可利用ALTER TABLE或DROP INDEX语句来删除索引.这里使用ALTER TABLE,首先查询所有索引,然后拼接成删除语句,复制执行即可 #拼接删除索引的语法 SELECT ...

  8. mysql百万数据建索引时间_mysql百万的数据快速创建索引

    测试数据本机一张表users有100百万条记录.在创建此表前没有未相应字段添加索引,所以此时需要为表添加索引.但是因为数据量大的原因,索引添加可能不成功,想了很多办法,终于挖坑成功. 开始准备工作, ...

  9. where 1=1会影响索引吗_MySQL之InnoDB存储引擎:索引的使用

    索引一直是MySQL的重点内容,这里主要介绍下InnoDB引擎下索引的使用 abstract.png 查找 为了后续行文方便,这里先给出一张表的SQL创建语句.可以看到在建立该表的同时还建立了一个联合 ...

最新文章

  1. 转发:Docker —— 从入门到实践
  2. 关于NandFlash在实际产品使用上的一些经验
  3. 移动开发:android , IOS html5
  4. Hive - HWI 简单使用
  5. java怎么接收前端请求_前端json post 请求 后端怎么接收
  6. 小米11真机现身:稳了!
  7. 学渣上手 LaTeX 完成毕业论文
  8. python实现京东联盟API接口对接
  9. 计算机作业实验报告dw感想,Dreamweaver实验报告.doc
  10. java编程加载窗口,插入图片
  11. eNSP路由器启动不了
  12. 青龙羊毛——可用脚本
  13. python flask后台框架_利用python实现后端写网页(flask框架)
  14. FIFA Women's World Cup France 2019™ -国际足协继海奶奶女子世足杯曲终人散,USA碰杯
  15. 视频文件顺时针旋转90度
  16. Qt C++ 录屏录音功能实现(avilib+ffmpeg)以及动态库生成
  17. 【如何使用高级语言在机器语言层面提高程序运行效率】
  18. python股票数据分析_用Python浅析股票数据
  19. Hyper-V安装Server 2019虚拟机
  20. 微信公众号三方平台开发【帐号注册、平台创建】

热门文章

  1. 无法将类型为“System.__ComObject”的 COM 对象强制转换为类类型“mshtml.HTMLInputElementClass...
  2. 关于MYsql 多字段排序
  3. Ext 中 radiogroup 的布局问题,当点击fieldLabel时,界面整体会向左移
  4. ASP.NET GetPostBackEventReference
  5. Ajax框架DWR入门
  6. 华为鸿蒙公测链接,华为鸿蒙系统2.0启动第二轮公测,新增6款nova机型
  7. Java之SPI机制
  8. LINUX设置固定IP上网方法
  9. Linux报错./configure: error: C compiler cc is not found
  10. 计算机组成原理 陈泽,江西师范大学-计算机组成原理的期末复习.doc