位置: 编程技术 - 正文

MySQL中的联合索引学习教程(mysql联合索引使用规则)

编辑:rootadmin

推荐整理分享MySQL中的联合索引学习教程(mysql联合索引使用规则),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:mysql联合索引数据结构是什么样的,mysql联合索引使用规则,mysql联合索引使用规则,mysql联合索引原理及失效原理,mysql中的联合索引,mysql中的联合索引,mysql中的联合索引,MySQL中的联合索引是指什么,内容如对您有帮助,希望把文章链接给更多的朋友!

联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。

两个或更多个列上的索引被称作复合索引。利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知 道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。如:建立 姓名、年龄、性别的复合索引。

复合索引的建立原则:

如果您很可能仅对一个列多次执行搜索,则该列应该是复合索引中的第一列。如果您很可能对一个两列索引中的两个列执行单独的搜索,则应该创建另一个仅包含第二列的索引。如上图所示,如果查询中需要对年龄和性别做查询,则应当再新建一个包含年龄和性别的复合索引。包含多个列的主键始终会自动以复合索引的形式创建索引,其列的顺序是它们在表定义中出现的顺序,而不是在主键定义中指定的顺序。在考虑将来通过主键执行的搜索,确定哪一列应该排在最前面。请注意,创建复合索引应当包含少数几个列,并且这些列经常在select查询里使用。在复合索引里包含太多的列不仅不会给带来太多好处。而且由于使用相当多的内存来存储复合索引的列的值,其后果是内存溢出和性能降低。

复合索引对排序的优化:

复合索引只对和索引中排序相同或相反的order by 语句优化。 在创建复合索引时,每一列都定义了升序或者是降序。如定义一个复合索引:

其中 有三列分别是:col1 升序,col2 降序, col3 升序。现在如果我们执行两个查询 1:

和索引顺序相同 2:

和索引顺序相反 查询1,2 都可以别复合索引优化。 如果查询为:

排序结果和索引完全不同时,此时的 查询不会被复合索引优化。

查询优化器在在where查询中的作用:

如果一个多列索引存在于 列 Col1 和 Col2 上,则以下语句:Select * from table where col1=val1 AND col2=val2 查询优化器会试图通过决定哪个索引将找到更少的行。之后用得到的索引去取值。 1. 如果存在一个多列索引,任何最左面的索引前缀能被优化器使用。所以联合索引的顺序不同,影响索引的选择,尽量将值少的放在前面。如:一个多列索引为 (col1 ,col2, col3) 那么在索引在列 (col1) 、(col1 col2) 、(col1 col2 col3) 的搜索会有作用。

2. 如果列不构成索引的最左面前缀,则建立的索引将不起作用。如:

3. 如果一个 Like 语句的查询条件不以通配符起始则使用索引。如:%车 或 %车% 不使用索引。 车% 使用索引。索引的缺点:1. 占用磁盘空间。2. 增加了插入和删除的操作时间。一个表拥有的索引越多,插入和删除的速度越慢。如 要求快速录入的系统不宜建过多索引。

下面是一些常见的索引限制问题

MySQL中的联合索引学习教程(mysql联合索引使用规则)

1、使用不等于操作符(<>, !=)下面这种情况,即使在列dept_id有一个索引,查询语句仍然执行一次全表扫描select * from dept where staff_num <> ;但是开发中的确需要这样的查询,难道没有解决问题的办法了吗?有!通过把用 or 语法替代不等号进行查询,就可以使用索引,以避免全表扫描:上面的语句改成下面这样的,就可以使用索引了。

2、使用 is null 或 is not null使用 is null 或is nuo null也会限制索引的使用,因为数据库并没有定义null值。如果被索引的列中有很多null,就不会使用这个索引(除非索引是一个位图索引,关于位图索引,会在以后的blog文章里做详细解释)。在sql语句中使用null会造成很多麻烦。解决这个问题的办法就是:建表时把需要索引的列定义为非空(not null)

3、使用函数如果没有使用基于函数的索引,那么where子句中对存在索引的列使用函数时,会使优化器忽略掉这些索引。下面的查询就不会使用索引:

但是把函数应用在条件上,索引是可以生效的,把上面的语句改成下面的语句,就可以通过索引进行查找。

4、比较不匹配的数据类型比较不匹配的数据类型也是难于发现的性能问题之一。下面的例子中,dept_id是一个varchar2型的字段,在这个字段上有索引,但是下面的语句会执行全表扫描。

这是因为oracle会自动把where子句转换成to_number(dept_id)=,就是3所说的情况,这样就限制了索引的使用。把SQL语句改为如下形式就可以使用索引

恩,这里还有要注意的:

比方说有一个文章表,我们要实现某个类别下按时间倒序列表显示功能:

这样的查询很常见,基本上不管什么应用里都能找出一大把类似的SQL来,学院派的读者看到上面的SQL,可能会说SELECT *不好,应该仅仅查询需要的字段,那我们就索性彻底点,把SQL改成如下的形式:

我们假设这里的id是主键,至于文章的具体内容,可以都保存到memcached之类的键值类型的缓存里,如此一来,学院派的读者们应该挑不出什么毛病来了,下面我们就按这条SQL来考虑如何建立索引:

不考虑数据分布之类的特殊情况,任何一个合格的WEB开发人员都知道类似这样的SQL,应该建立一个”category_id, created“复合索引,但这是最佳答案不?不见得,现在是回头看看标题的时候了:MySQL里建立索引应该考虑数据库引擎的类型!

如果我们的数据库引擎是InnoDB,那么建立”category_id, created“复合索引是最佳答案。让我们看看InnoDB的索引结构,在InnoDB里,索引结构有一个特殊的地方:非主键索引在其BTree的叶节点上会额外保存对应主键的值,这样做一个最直接的好处就是Covering Index,不用再到数据文件里去取id的值,可以直接在索引里得到它。

如果我们的数据库引擎是MyISAM,那么建立"category_id, created"复合索引就不是最佳答案。因为MyISAM的索引结构里,非主键索引并没有额外保存对应主键的值,此时如果想利用上Covering Index,应该建立"category_id, created, id"复合索引。

唠完了,应该明白我的意思了吧。希望以后大家在考虑索引的时候能思考的更全面一点,实际应用中还有很多类似的问题,比如说多数人在建立索引的时候不从Cardinality(SHOW INDEX FROM ...能看到此参数)的角度看是否合适的问题,Cardinality表示唯一值的个数,一般来说,如果唯一值个数在总行数中所占比例小于%的话,则可以认为Cardinality太小,此时索引除了拖慢insert/update/delete的速度之外,不会对select产生太大作用;还有一个细节是建立索引的时候未考虑字符集的影响,比如说username字段,如果仅仅允许英文,下划线之类的符号,那么就不要用gbk,utf-8之类的字符集,而应该使用latin1或者ascii这种简单的字符集,索引文件会小很多,速度自然就会快很多。这些细节问题需要读者自己多注意,我就不多说了。

对MySQL日志操作的一些基本命令总结 MySQL日志主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志;日志是mysql数据库的重要组成部分。日志文件中记录着mysql数据库运行

MySQL的日志基础知识及基本操作学习教程 MySQL日志主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志;日志是mysql数据库的重要组成部分。日志文件中记录着mysql数据库运行

MySQL入门完全指南及Linux系统下基本的安装教程 我们来了解一下MySQL的基本特性:1.内部构件和可移植性使用C和C++编写用众多不同的编译器进行了测试能够工作在众多不同的平台上。请参见2.1.1MySQL支

标签: mysql联合索引使用规则

本文链接地址:https://www.jiuchutong.com/biancheng/312354.html 转载请保留说明!

上一篇:MySQL中主键索引与聚焦索引之概念的学习教程(mysql索引和主键)

下一篇:对MySQL日志操作的一些基本命令总结(mysql四种常见日志)

  • 增值税普通发票几个点
  • 销售返利可以计入销售费用吗
  • 年度纳税申报表A105000纳税调整项目明细表中,收入
  • 建筑业增值税税负预警
  • 进口货物增值税的组成计税价格是
  • 居民个人所得计算怎么做
  • 盈利能力也可以反映短期偿债能力
  • 新成立小规模纳税人开发票如何办理
  • 房地产开发企业土地增值税预缴
  • 银行电子承兑汇票怎么转让
  • 税务局开专票作废重开及退税流程
  • 民办非营利组织幼儿园清算时固定资产如何处理
  • 应交税费应交增值税转出多交增值税
  • 何为提租补贴
  • 金蝶软件开发服务费入什么科目?
  • 非居民企业所得税源泉扣缴管理暂行办法
  • 所得税汇算清缴调整项目
  • 其他账簿印花税减免税优惠政策
  • 增值税普票收款人
  • 电子发票缩小多少比例打印
  • 公司员工出差补贴与差旅费报销制度
  • 工会经费电子税务局找不见了
  • 生活服务业包括哪些行业照片
  • 购方收到红字发票怎么办
  • 代销商品
  • 合作保证金规定
  • 增值税普通发票红冲之后还能查询吗
  • 个税扣缴端如何删除员工信息
  • 财政给企业的补助资金企业是否需要开发票
  • 税控盘服务费抵减有效期几年
  • 预提费用年底如何结转
  • 1697509966
  • 在建工程产生废料收入的账务处理?
  • 没票的购进能入成本吗
  • 业务招待费例子
  • php红包源码
  • 开机反应慢是怎么回事
  • kb4580419更新
  • 集团内部调拨账务处理
  • 违约金开什么票据
  • 用彩泥可以做什么食物?
  • PHP:imagefilledellipse()的用法_GD库图像处理函数
  • phpsetcookie
  • 增值税专用发票怎么开
  • 没有审计报告的情况说明
  • 情感计算的应用
  • 为什么说网络安全靠人民
  • 矿产资源补偿费是什么
  • php和mysql的软件怎么部署
  • 充话费如何开公司发票
  • 差旅费取得发票怎么处理
  • 考试费开什么发票税目
  • 销售自己使用过的物品
  • 资产总额是营业收入吗
  • 季报现金流量表可以不填吗
  • 无形资产的税收优惠政策
  • 国债逆回购收益什么时候到账
  • 去年亏损今年有盈利合伙企业怎么交生产经营所得税
  • 消防设施安装费收费标准
  • 增值税留抵税额借贷方向
  • 发现以前年度增值税附表2填写错了那时增值税是0
  • 转出未交增值税会计处理
  • 应交增值税一转出未交增值税
  • 其他应收款如何做坏账处理
  • 国内佣金如何入账
  • 事件查看器中"TermService" 服务的性能库问题处理
  • ubuntu20.04快捷键
  • PSof1.exe - PSof1是什么进程 有什么作用
  • linux arp -s
  • windows 8开机
  • <Unity3D>Unity3D GUI控件
  • qt5.15教程
  • js删除数组中某一个对象
  • python爆破脚本
  • [置顶]电影名字《收件人不详》
  • jquery使用教程
  • python迭代器iterator
  • 河北省国家税务局长简介
  • 环保税要求标注什么
  • 徐州注销营业执照去哪里
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设