mysql 组合索引 or_mysql索引优化实例(单列索引与组合索引)

索引一般用于在数据规模大时对查询进行优化的一种机制,对于一般的查询来说,mysql会去遍历整个表,来查询符合要求的结果;

如果借助于mysql索引,mysql会将要索引的字段按照一定的算法进行处理,并生成一个类似于书本目录的文件存放在相应的位置,这样在查询时,mysql会先去查找这些"目录",然后根据这些"目录"来快速定位所需记录的位置,这样的查找不用遍历整个记录集,速度自然会很快,对于海量数据尤其如此。

注意,在向存在索引的表中插入数据时,因为要维护索引信息,要比不存在索引的表慢一些,因此当数据量大时,可以考虑在插入完数据之后再建立索引。

索引分为单列索引和组合索引,对于这两种索引,分别介绍其索引优化问题。

1、单列索引

单列所有只包含一个字段,一个表可以包含多个单列索引,但是不要把这个和组合索引混淆。利用以下sql创建测试表:

复制代码 代码示例:

--创建包含单列索引的index_test_single_a表

create table `index_test_a` (

`id` int(11) not null auto_increment,

`title` char(255) character set utf8 not null,

`content` text character set utf8,

`num` int(11) default null,

primary key (`id`),

unique key `indexname` (`title`),

unique key `numindex` (`num`)

) engine=innodb auto_increment=10000 default charset=latin1;

--创建不包含单列索引的index_test_single_b表

create table `index_test_b` (

`id` int(11) not null auto_increment,

`title` char(255) character set utf8 not null,

`content` text character set utf8,

`num` int(11) default null,

primary key (`id`)

) engine=innodb auto_increment=10000 default charset=latin1;

其中a表包含title的单列索引,b表的title字段不存在索引,但是两个表都有一个主键id,其实主键也是索引的一种,这个会在后面详细解释。

写程序向这两个表中各导入10000条数据,然后就可以测试了。

1.1、测试查询索引字段所用的时间,代码如下:

复制代码 代码示例:

//phpinfo();

ini_set('max_execution_time', 200);

$con = mysql_connect("localhost:3306","root","710100");

if (!$con)

{

die('could not connect: ' . mysql_error());

}

else{

mysql_select_db("test",$con);

$sqla = "select * from index_test_a where title = 'title_4999';";

$sqlb = "select * from index_test_b where  title = 'title_4999';";

$starttimea = microtime();

$result = mysql_query($sqla) or   die( "invalid   query:   "   .   mysql_error());

$endtimea = microtime();

echo "a表查询所有记录所用时间:".(($endtimea-$starttimea)*1000)."毫秒";

echo "
";

$starttimeb = microtime();

$result = mysql_query($sqlb) or   die( "invalid   query:   "   .   mysql_error());

$endtimeb = microtime();

echo "b表查询所有记录所用时间:".(($endtimeb-$starttimeb)*1000)."毫秒";

mysql_close($con); // by www.jbxue.com

}

?>

执行结果如下:

a表查询所有记录所用时间:0.624毫秒

b表查询所有记录所用时间:44.484毫秒

可以看到仅仅10000条记录的查找差别,时间已经相差了几十倍,因此对于经常查询的字段,索引是十分必要的。相应的,如果我们查询没有做索引的字段,那么是没有区别的,将以上的sql语句改为:

复制代码 代码示例:

$sqla = "select * from index_test_a where content = 'content_4999';";

$sqlb = "select * from index_test_b where  content = 'content_4999';";

结果如下:

a表查询所有记录所用时间:23.848毫秒

b表查询所有记录所用时间:24.155毫秒

1.2、测试like查询

在我们项目中,如果数据量大,则不推荐like查询,因为其查询效率比较低,但是对于索引字段来说,like能命中吗?

可以将sql语句改成如下所示:

复制代码 代码示例:

$sqla = "select * from index_test_a where title like '4999%'";

$sqlb = "select * from index_test_b where title like '4999%'";

测试结果:

a表查询所有记录所用时间:0.488毫秒

b表查询所有记录所用时间:25.281毫秒

可以看到对于模糊查询来说,如果是前缀匹配,则会命中索引,但是如果我们将sql改为后缀匹配或者任意匹配,那么二者所消耗的查询时间是一致的:

复制代码 代码示例:

$sqla = "select * from index_test_a where title like '%4999'";

$sqlb = "select * from index_test_b where title like '%4999'";

$sqla = "select * from index_test_a where title like '%4999'";

$sqlb = "select * from index_test_b where title like '%4999'";

a表查询所有记录所用时间:44.742毫秒

b表查询所有记录所用时间:45.752毫秒

即二者都没有命中索引。

1.3、测试or语句,将sql改为如下所示:

复制代码 代码示例:

$sqla = "select * from index_test_a where  content='content_4999' or title='title_4999';";

$sqlb = "select * from index_test_b where  content='content_4999' or title='title_4999';";

测试结果如下:

a表查询所有记录所用时间:49.904毫秒

b表查询所有记录所用时间:50.131毫秒

继续将sql改为如下:

复制代码 代码示例:

$sqla = "select * from index_test_a where  id=4999  or title='title_4999';";

$sqlb = "select * from index_test_b where  id=4999  or title='title_4999';";

测试结果如下:

a表查询所有记录所用时间:0.86毫秒

b表查询所有记录所用时间:47.318毫秒

从上面的结果可以看到,当or中有一个字段没有索引的时候,那么将不会命中索引;反之,如果or运算的所有字段均做了索引,那么是可以命中的。

1.4、测试in,将sql语句继续改为如下所示:

复制代码 代码示例:

$sqla = "select title from index_test_a  where title in ('title_4999','title_5000');";

$sqlb = "select title from index_test_b  where title in ('title_4999','title_5000');";

测试结果为:

a表查询所有记录所用时间:0.817毫秒

b表查询所有记录所用时间:24.234毫秒

可见对于索引字段,in也是可以命中索引的。

1.5、测试,between等,将sql改为如下所示:

复制代码 代码示例:

$sqla = "select title from index_test_a  where num < 999;";

$sqlb = "select title from index_test_b  where num < 999;";

测试结果如下:

a表查询所有记录所用时间:11.469毫秒

b表查询所有记录所用时间:21.728毫秒

可见二者差别不是很大,因此是没有命中索引的。

1.6、对于mysql函数,索引的命中,将sql改为如下所示:

复制代码 代码示例:

$sqla = "select num from index_test_a  where char(num) in ('999','9999');";

$sqlb = "select num from index_test_b  where  char(num) in ('999','9999');";

得到的结果如下所示:

a表查询所有记录所用时间:11.322毫秒

b表查询所有记录所用时间:12.429毫秒

所以如果在条件中使用函数,那么索引将会失效。

2、组合索引

组合索引包括对多个列的索引,而不是多个单列索引的组合,将表a中的所以改成(title,num)的组合索引,进行以下测试:

2.1、or测试

将sql语句改成如下所示:

复制代码 代码示例:

$sqla = "select * from index_test_a where  num=4999  or title='title_4999';";

$sqlb = "select * from index_test_b where  num=4999 or title='title_4999';";

结果如下所示:

a表查询所有记录所用时间:52.535毫秒

b表查询所有记录所用时间:53.031毫秒

这时索引没有命中,索引组合索引的or运算和两个单列索引的or运算是不同的,前者失效而后者依然有效。

2.2、and测试

将sql语句改成如下所示:

复制代码 代码示例:

$sqla = "select * from index_test_a where  num=4999  and title='title_4999';";

$sqlb = "select * from index_test_b where  num=4999 and title='title_4999';";

结果如下所示:

a表查询所有记录所用时间:0.666毫秒

b表查询所有记录所用时间:43.042毫秒

继续改为:

复制代码 代码示例:

$sqla = "select * from index_test_a where  num=4999 ;";

$sqlb = "select * from index_test_b where  num=4999 ;";

得到的结果:

a表查询所有记录所用时间:39.398毫秒

b表查询所有记录所用时间:41.057毫秒

而改成如下sql:

复制代码 代码示例:

$sqla = "select * from index_test_a where  title='title_'4999 ;";

$sqlb = "select * from index_test_b where  title='title_4999' ;";

得到的结果则为:

a表查询所有记录所用时间:0.753毫秒

b表查询所有记录所用时间:48.248毫秒

由以上三组结果可以看出,组合索引是最左前缀匹配的,即条件中要包含第一个索引列,才会命中索引。

3、索引的优缺点

利用索引可以大大加快我们的搜索,但是维护索引需要额外的开销,尤其是当索引较多的时候,大量的数据会很容易带来索引量的膨胀,因此对于频繁要用到的查询,才需要做索引,这样才能以最小的代价获得最大的性能提升。

mysql索引优化应用实例

MySql索引优化注意要点

mysql索引与mysql索引优化查询

Mysql索引优化方法解析

深入理解MySQL索引与优化

mysql索引优化实例分享

mysql索引使用与优化

分享:Mysql索引优化的技巧

mysql性能优化之索引优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/562369.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于java SSM springboot景区行李寄存管理系统设计和实现

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f…

Spring、SpringMVC和SpringBoot之间的关系

1、Spring Spring是一个开源容器框架&#xff0c;它接管了Web层、业务层、DAO层、持久性层的组件&#xff0c;并可以配置各种bean并维护bean到bean的关系。 其核心是控制反转(IOC)和面向方面(AOP)&#xff0c;这只是一个分层的轻量级开源框架。 2、SpringMVC Spring MVC属于Spr…

mysql 5.7.13 mac_Mac 安装mysql 5.7.13版本 登录及改密码

小白用户&#xff0c;首次安装5.7.13&#xff0c;刚开始有些蒙&#xff0c;改密码就就是个坑&#xff0c;好在还是解决了&#xff0c;记录一下心路历程&#xff1a;安装的过程很简单&#xff0c;就直接到官方下mysql dmg&#xff0c;一路下一步就可以装完..Ps:安装完毕之前会有…

java springboot经典面试题分享

1. SpringBoot 简介 SpringBoot 是简化 Spring 应用开发的一个框架。他整合了 Spring 的技术栈&#xff0c;提供各种标准化的默认配置。使得我们可以快速开发 Spring 项目&#xff0c;免掉 xml 配置的麻烦。降低 Spring 项目的成本。 2. SpringBoot 的优缺点 使编码配置部署都变…

mysql创建临时表 分页_Mysql 如何创建一张临时表

mysql 利用 temporary 关键字就可以创建出一个临时表。创建的这张表会在与服务器的会话终止时自动消失语法&#xff1a;create temporary table tbl_name...;规则&#xff1a;每个会话只能看到自己创建的临时表&#xff0c;不同的会话可以创建相同表名称的临时表。临时表的表名…

SpringCloud面试题分享

1、什么是Spring Cloud&#xff1f; Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序&#xff0c;提供与外部系统的集成&#xff0c;更专注于服务治理。Spring cloud Task&#xff0c;一个生命周期短暂的微服务框架&#xff0c;用于快速构建执行有限数…

基于java SSM springboot动物检疫信息管理系统设计和实现

作者主页&#xff1a;Java李杨勇 简介&#xff1a;Java领域优质创作者、【Java李杨勇】公号作者 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 文末获取源码 主要技术实现&#xff1a;spring、 springmvc、 springboot、 springboot security权限控…

mysql for update场景_一个mysql死锁场景实例分析

前言最近遇到一个mysql在RR级别下的死锁问题&#xff0c;感觉有点意思&#xff0c;研究了一下&#xff0c;做个记录。涉及知识点&#xff1a;共享锁、排他锁、意向锁、间隙锁、插入意向锁、锁等待队列场景隔离级别&#xff1a;Repeatable-Read表结构如下create table t (id int…

mysql timestamp排序_对多个表进行排序MYSQL TimeStamp

编辑&#xff1a; H3>我已经尝试加入表格&#xff0c;在php中使用strtotime对它们进行排序..但我似乎无法获得语法。玩这个代码..但它变得非常复杂&#xff0c;我希望我可以在纯SQL中更容易。它不完整&#xff0c;但是..你可以看到我在想什么。mysql_connect("localhos…

基于java ssm springboot女士电商平台系统源码+文档设计

作者主页&#xff1a;Java李杨勇 简介&#xff1a;Java领域优质创作者、【Java李杨勇】公号作者 简历模板、学习资料、面试题库、技术互助【关注我&#xff0c;都给你】 文末获取源码 主要技术&#xff1a;spring, springmvc, springboot,mybatis, jquery , md5 ,bootstarp.…

mysql创建表定义主键_mysql 创建表并设置主键自增

mysql 创建表并设置主键自增 mysql 创建表: mysql> create table user( -> userid int(4) primary key not null auto_increment, -> username varchar(16) not null, -> userpassword varchar(32) not null -> ); create table log( logid int(4) primary key…

基于java ssm springboot网上蛋糕商城项目设计和实现

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 文末获取源码联系方式&#x1f4dd; 主要技术&#xff1a;spring、 springmvc、 springboot、 mybatis 、 jquery 、 md5 、bootstarp.js tomcat、富文本编译器、拦截器等 主要功能:登录、注册、商品浏览、…

基于Java springboot+vue+redis前后端分离家具商城平台系统设计和实现

主要技术实现&#xff1a;spring、 springmvc、 springboot、 mybatis 、 jquery 、 md5 、bootstarp.js tomcat、富文本编译器、拦截器等 主要设计功能&#xff1a;用户登录、注册、商城分类、商品浏览、查看、购物车、订单、支付、以及后台的管理 4.3用户需求分析 用户…

jq 修改swal的标题_js-jquery-SweetAlert2【一】使用

一、下载安装地址&#xff1a;https://github.com/limonte/sweetalert2二、页面引用当然还有jquery三、示例3.1、基础结构window.οnlοadfunction(){swal("Here‘s a message!");//以下代码主要修改这里}3.2、精简用法1、标题【alert】-swal(string)swal("Here…

基于Java springmvc+mybatis酒店信息管理系统设计和实现

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、【java李杨勇】公号作者✌ 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &#x1f345;文末获取源码联系&#x1f345; 临近学期结束&#xff…

mysql 管理instance_对于多instance安装的MYSQL来说,起停的过程相对复杂,可以定义一些简单的脚本来简化日常的管理。1# 环境变量脚本[mysql@mysql01 scri...

对于多instance安装的MYSQL来说&#xff0c;起停的过程相对复杂&#xff0c;可以定义一些简单的脚本来简化日常的管理。1# 环境变量脚本[mysqlmysql01 scripts]$ cat mysql_env.ini#set envMYSQL_USERrootMYSQL_PASSpassword123 #明文保存的密码&#xff0c;生产库中当然不可以…

基于JAVA SSM springboot实现的抗疫物质信息管理系统设计和实现

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、【java李杨勇】公号作者✌ 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &#x1f345;文末获取源码联系&#x1f345; 临近学期结束&#xff…

mysql注册slave_创建slave库?spm=a2c4e.11155472的搜索结果-阿里云开发者社区

云原生必备知识&#xff1a; 应用储存所属技术领域&#xff1a;云原生| 名词定义 |由于容器本身是非持久化的&#xff0c;因此需要解决在容器中运行应用程序遇到的一些问题。首先&#xff0c;当容器崩溃时&#xff0c;kubelet将重新启动容器&#xff0c;但是写入容器的文件将会…

基于java springmvc+mybatis学生考试系统设计和实现

&#x1f345; 作者主页&#xff1a;Java李杨勇 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、【java李杨勇】公号作者✌ 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &#x1f345;文末获取源码联系&#x1f345; 临近学期结束&#xff…

java文件编译为class文件需要键入什么命令_cmd命令行 编译Java 文件

【问题引入】 很多时候,需要用到命令行来进行Java文件的编译。在用习惯了IDE 可能会不清楚如何在cmd命令行窗口进行编译,简单的都还好,带有包路径的可能会让很多人觉得有点小头疼。最近试了一下,发现了问题,就研究整理了一下记录吧。 【注1】环境准备, JDK,classpath 都…