首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Mysql索引原理及应用场景

# 什么是索引在工作当中,涉及到Mysql的查询,我们经常会遇到给某个表某个字段加索引的诉求,加上索引能够让我们的sql得到查询速度上的提升。...假设现在有如下场景,按照市民的身份证号去查询他的家庭地址,这个查询需求在业务中出现的概率不高,但我们也不能让他直接走全表扫描。...----+------+---------+------+------+----------+-----------------+1 row in set, 2 warnings (0.00 sec)索引失效场景使用原则使用联合索引应满足最左匹配原则匹配数据从左至右...索引尽量不用在高频更新的字段上,最好用在高频查询字段失效场景like '%xx'select * from t_users where name like '%张';首字母有序时,后续相对有序,但无法确定首字符时...使用函数比如将索引列放入函数计算中,就无法走索引,比如max(age)。其原因在于,B+树需要把所有元素都应用在函数中才能比较。

1.2K10

谈谈MYSQL索引失效场景

= 或者)索引失效 ​编辑 前言 MYSQL索引是经常用来对数据库查询性能优化的方式,再MySQL中采用了B+树作为索引结构来减少磁盘IO次数去提高数据的检索性能。...但是在某些场景下,由于查询语句设计不合理,或者对MySQL的理解不够深入。索引有可能会失效,变为全表扫描,这对于大数据量的查询是非常低效的。今天我们就来聊聊这些常见的失效场景。...MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引索引提供了访问高效数据的方法,并且加快查询的速度,因此索引对查询的速度有着至关重要的影响。...另外,SQL语句是否使用索引,跟数据库版本、数据量、数据选择度都有关系。 当Mysql使用索引的要扫描行记录数超过全表的10%-30%时,优化器可能会放弃走索引。...最左前缀原则是MySQL中的最佳左前缀原则,通过使用联合索引可以避免最左边的匹配问题。因此,如果查询字段包含联合索引,则应优先选择使用最左前缀原则。

38110
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Mysql索引失效的场景

    索引失效的场景: 1.or语句前后没有同时使用索引。...7.如果mysql觉得全表扫描更快时(数据少); 8. 在索引列上使用 IS NULL 或 IS NOT NULL操作。...没必要用索引场景 1.唯一性差; 2.频繁更新的字段不用(更新索引消耗); 3.where中不用的字段; 4.索引使用时,效果一般; 索引并不是时时都会生效的,比如以下几种情况,将导致索引失效:...where 子句里对有索引列使用函数,用不上索引 如果mysql估计使用全表扫描要比使用索引快,则不使用索引 比如数据量极少的表 什么情况下不推荐使用索引?...3) 字段不在where语句出现时不要添加索引,如果where后含IS NULL /IS NOT NULL/ like ‘%输入符%’等条件,不建议使用索引 只有在where语句出现,mysql才会去使用索引

    6.9K40

    MySQL|索引应用

    可以先看下这篇理论介绍: MySQL|索引背后 01 MySQL的几种KEY PRIMARY KEY 有两个作用,一是约束作用(constraint),用来规范一个存储主键和唯一性,但同时也在此key...导入MySql的employees库,下载地址: https://dev.mysql.com/doc/employee/en/employees-installation.html 解压缩后,找到 employees.sql...最左前缀的范围列可以用到索引,范围索引只能有一个。 08 每张表都得建索引? 答案是否定的。因为添加索引需要付出相应的代价,索引文件本身要消耗存储空间,同时索引会加重插入、删除和修改记录时的负担。...一般两种情况下不建议建索引。 第一种情况是表记录比较少,例如一两千条甚至只有几百条记录的表,没必要建索引,让查询做全表扫描就好了。 另一种索引的选择性较低时不需要建立索引。...参考文章: http://blog.codinglabs.org/articles/theory-of-mysql-index.html 以上,索引应用实例,如果有疏漏,请指导!

    81370

    MySQL中B+树索引应用场景大全

    一、本文所用到的数据表   本篇是讲B+树的应用场景,也就是我们平时在写sql语句时需要思考的问题,这里重点总结一下   首先列出建表语句,后面例子均在此表基础上举例说明。...---- 九、使用联合索引场景 我们前面说了,有联合索引KEY idx_key_part(key_part1, key_part2, key_part3) eg1: select * from demo_info...MySQL 8.0 引入了Descending Index的特性,允许利用索引直接asc和desc混合排序。   ...而在MySQL8.0以下,索引声明desc是直接被忽略的。 4.排序中不能包含非同一索引的列,否则不走索引 排序中用来排序的多个列不是同一索引是不能使用索引排序的。...7.如有必要,尽量考虑使用索引覆盖   我个人在某业务场景中,需要查询根据会话id(session_id)和场景id(scene_id)去查询有没有这条记录,从而继续下一步插入或者更新操作,但是session_id

    40010

    Mysql索引-不会使用索引场景

    此时我们可以使用下面语句,实现我们需要的结果,下面语句也用上了索引的快速定位能力,但是比较繁琐 mysql> select count(*) from tradelog where -> (t_modified...,是无法使用索引快速定位的功能,而只能全索引扫描,需要注意的是,函数没有破坏索引的有序性,优化器也不会考虑使用索引的快速定位能力的, 案例二:隐式类型转换 我们先看看下面语句 mysql> select...在mysql中,字符串和数字做比较的话,是将字符串转换成数字....上面的语句实际上在优化器里面就如下面语句 mysql> select * from tradelog where CAST(tradid AS signed int) = 110717; 从上一个案例我们知道使用了函数是不会走索引的...,一个个判断tradeid的值是否符合 正常按照我们的理解,第二行的tradeid它也是有索引的,应该也是使用索引才对,为什么没有使用索引的 其实第三步,相当是下面语句 mysql> select

    1.2K20

    MySQL常见的索引失效场景

    Index '索引名' ON 表名;索引的作用 索引类似于一本书的目录,当你想在一本数学书中找到三角函数那章如果没有目录只能随机翻或者一页一页翻,有索引只需要找到目录变能快速定位主索引和二级索引的存储形式区别主键索引的叶子节点存储的是整行数据...主键索引的叶子节点按照主键的顺序存储数据行,因此主键索引实际上就是数据在磁盘上的物理存储顺序。二级索引的叶子节点存储的是索引键值及指向相应数据行的物理指针。...id > 1 or id < 80; //不走索引,两边都进行比较不会走索引select * from t_user where id BETWEEN 1 and 80; //走索引联合索引失效的情况联合索引在...mysql中的常见语句如下KEY `union_idx` (`列1`,`列2`,`列3`)在上述中我们创建的三个列组成的联合索引查询条件不满足最左匹配原则 当我们使用where查询条件中没有列1时将会造成索引失效...:覆盖索引 覆盖索引即二级索引包含了查询需要的所有列,并且你的操作字段中也只有索引字段,那么就会走索引了,前面提到的失效情况就无效了,但是这种情况一般较少,索引建多了会占用空间,写操作变慢(插入数据的时候也要更新

    10210

    MySQL索引创建错误的场景

    这个库是MySQL 8.0,从官方手册,可以找到这段对Index Prefixes的说明(如下所示),意思是如果对BLOB或者TEXT列创建索引,必须指定索引的前缀长度。...MySQL 5.7官方手册中,对索引前缀的限制有所不同,InnoDB表的索引前缀最多可以达到1000个字节(此处结合其它章节的说名和实验,我认为是错误的,应该是3072个字节),但前提是设置了innodb_large_prefix...因此,可以看到MySQL 5.7和8.0在InnoDB表的索引前缀长度限制的设置上有所调整,但是限制还是有,这是和Oracle等有所不同的一个特性。...因此,虽然这个问题表象是个技术问题,但实际上来源于不合理的设计,我们在进行应用设计、数据库设计时,如果能多考虑一些合理性,避免一些所谓的省事儿,可能在实际使用过程中就会更顺畅,事半功倍。...近期更新的文章: 《MySQL的字符集转换操作场景》 《金融知识小科普 - 二级市场》 《poweroff指令的介绍》 《MySQL 8.0新密码策略的细节场景讲解》 《几种数据泄露场景的排查解决路径》

    27440

    mysql 索引类型以及使用场景

    关于MySQL索引的好处,如果正确合理设计并且使用索引MySQL是一辆兰博基尼的话,那么没有设计和使用索引MySQL就是一个人力三轮车。...全文索引(FULLTEXT) MySQL从3.23.23版开始支持全文索引和全文检索,在mysql5.6版本以前FULLTEXT索引仅可用于 MyISAM 表,在5.6之后innodb引擎也支持...索引只是提高效率的一个因素,如果你的MySQL有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。下面是一些总结以及收藏的MySQL索引的注意事项和优化方法。 1....例如,如果应用程序执行的一个查询经常检索某一日期范围内的记录,则使用聚集索引可以迅速找到包含开始日期的行,然后检索表中所有相邻的行,直到到达结束日期。这样有助于提高此 类查询的性能。...备注:聚集索引一张表只能创建一个,非聚集索引一张表可以创建多个,在mysql中InnoDB引擎是唯一支持聚集索引的存储引擎。

    1.6K10

    MySQL大表增加唯一索引场景

    MySQL中对于字段、索引的使用,就需要些技巧,否则就会碰到坑,这是初学MySQL,比较不太适应的一个点,看到技术社区推的这篇文章《技术分享 | MySQL 大表添加唯一索引的总结》,就讲到了MySQL...MySQL 5.6 开始支持 Online DDL ,添加[唯一]索引虽然不需要重建表,也不阻塞 DML ,但是大表场景下还是不会直接使用 Alter Table 进行添加,而是使用第三方工具进行操作,...这个工具暂时也没有相关辅助功能保证不丢数据或者在丢数据的场景下终止添加唯一索引操作。...通过应用原表 DML 产生的 binlog 同步增量数据。...针对这类场景,规避方式可以禁止【添加唯一索引与其他改表动作】同时使用。

    2.7K40

    Mysql数据库应用--索引(二)

    ,用来指定创建索引;col_name为需要创建索引的字段列,该列必须从数据表中定义的多个列中选择;index_name指定索引的名称,为可选参数,如果不指定,MySQL默认col_name为索引值;length...为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;ASC或DESC指定升序或者降序的索引值存储 查看索引 CREATE TABLE `book`( `bookId` INT NOT NULL...组合索引可起到几个索引的作用,但是使用时并不是随便查询哪个字段都可以使用索引,而是要遵循“最左前缀”原则:利用索引中最左边的列集来匹配行,这样的列集称为最左前缀。...(4) possible_keys: 给出MySQL在搜索数据记录时可选用的各个索引。 (5) key: MySQL实际选用的索引。...(8) rows: MySQL在执行这个查询时预计会从这个数据表里读出的数据行的个数。 (9) extra: 提供与关联操作有关的信息。

    1.2K30

    MySQL索引优化与常见失效场景,聚簇索引与非聚簇索引的区别

    引言 在数据库系统中,索引是提高数据查询效率的重要工具。针对MySQL数据库,索引优化是提高查询性能的关键。...本文将深入探讨MySQL索引的优化策略,介绍常见的索引失效场景,并详细解释聚簇索引与非聚簇索引的区别。 索引优化策略 选择合适的索引列 在创建索引时,选择适合作为索引列的字段非常重要。...常见的索引失效场景 不使用索引列作为查询条件 如果查询语句中没有使用索引列作为查询条件,那么索引将不会被使用,导致全表扫描,严重影响查询性能。...非聚簇索引包含索引列的值和指向实际数据行的指针。虽然非聚簇索引的范围查询性能相对较差,但插入和更新操作不会引起数据页的分裂,因此在高并发的写入场景下表现更好。...通过选择合适的索引列、避免冗余索引以及了解索引失效的常见场景,可以有效提升数据库查询效率。此外,理解聚簇索引和非聚簇索引的区别,能够帮助我们更好地设计数据库表结构和索引

    33740

    mysql 前缀索引_MySQL前缀索引

    有时候需要索引很长的字符字段列,这会增加索引的存储空间以及降低索引的查询效率,一种策略是可以使用哈希索引,还有一种就是使用前缀索引。...前缀索引是选择字符列的前n个字符作为索引,这样可以大大节约索引空间,从而提高索引效率。...前缀索引的选择性 使用前缀索引,在一些场景下可能使得重复的索引值变多,索引的选择性变低,查找时需要过滤更多的行,因此建立前缀索引也要考虑前缀的索引选择性不能太低。...MySQL 无法使用前缀索引做 ORDER BY 和 GROUP BY , 也无法使用前缀索引做覆盖扫描。...后缀索引 MySQL 没有提供后缀索引,事实上,一些业务场景对后缀匹配选择性更高,比如我曾经参与过的项目,手机的入网标示imei号,前缀都是86等固定的国家编号开头,这个时候可以将字符反转后存储,就可以建立选择性较高的前缀索引

    4.8K30

    MySQL 全文索引应用简明教程

    本文从以下几个方面介绍下MySQL全文索引的基础知识: MySQL全文索引的几个注意事项 全文索引的语法 几种搜索类型的简介 几种搜索类型的实例 全文索引的几个注意事项 搜索必须在类型为fulltext...的索引列上,match中指定的列必须在fulltext中指定过 仅能应用在表引擎为MyIsam类型的表中(MySQL 5.6以后也可以用在Innodb表引擎中了) 仅能再char、varchar、text...几种搜索类型的实例介绍 IN NATURAL LANGUAGE MODE模式下的应用: 还是应用在product表,其中在name字段我们建立了全文索引,因为我需要根据关键词在name列匹配出相关记录...可以直接应用在没有创建fulltext的全文索引上,但是这样会查询的非常慢,所以说还是别用了。 4. 支持最小、最大单词长度 5....了解了基本的mysql全文索引知识,觉得它的全文索引比like当然是强了很多。但是面对高级的搜索还是略显简陋,且性能问题也是担忧。 本人只是作为入门了解,也是对官网一些基本知识的翻译。

    1.6K100

    mysql前缀索引使用,Mysql:前缀索引索引

    可以像普通索引一样使用mysql前缀索引吗?...解决方法: 如果你想一下,MySQL仍会给你正确的答案,即使没有索引…它只是不会那么快……所以,是的,你仍然会得到一个正确的答案前缀索引....性能会降低,因为在将“可能”行与索引匹配后,服务器将转到行数据并进一步根据WHERE子句过滤结果.两个步骤而不是一个,但应用程序无需关心....前缀索引的排序不超出前缀的长度.如果您的查询使用完整索引来查找行,您通常会发现返回的行是按索引顺序隐式排序的.如果您的应用程序需要这种行为,那么它当然会期待它不应该期望的东西,因为除非您显式ORDER...标签:mysql,indexing,innodb 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/142503.html原文链接:https://javaforall.cn

    5.3K20

    Mysql覆盖索引_mysql索引长度限制

    只扫描索引而无需回表的优点: 1.索引条目通常远小于数据行大小,只需要读取索引,则mysql会极大地减少数据访问量。...(innodb的二级索引在叶子节点中保存了行的主键值,所以如果二级主键能够覆盖查询,则可以避免对主键索引的二次查询) 覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引不存储索引列的值,所以mysql...当发起一个索引覆盖查询时,在explain的extra列可以看到using index的信息 覆盖索引的坑:mysql查询优化器会在执行查询前判断是否有一个索引能进行覆盖,假设索引覆盖了where条件中的字段...如上图则无法使用覆盖查询,原因: 1.没有任何索引能够覆盖这个索引。因为查询从表中选择了所有的列,而没有任何索引覆盖了所有的列。 2.mysql不能在索引中执行LIke操作。...mysql能在索引中做最左前缀匹配的like比较,但是如果是通配符开头的like查询,存储引擎就无法做比较匹配。

    7.9K30

    扫码

    添加站长 进交流群

    领取专属 10元无门槛券

    手把手带您无忧上云

    扫码加入开发者社群

    相关资讯

    热门标签

    活动推荐

      运营活动

      活动名称
      广告关闭
      领券