首页
学习
活动
专区
圈层
工具
发布

mysql为什么加索引就能快

平时我们要优化 mysql 查询效率的时候,最常见的就是给表加上合适的索引了,那今天就来聊聊为什么加了索引就快了呢。...mysql 索引其实就是一颗 B+ 树。...比如下面这条 sql 语句,显然没有可用的索引,所以只能走全表扫描了,即把主键索引上的叶子节点从头到尾都扫描一遍,然后每扫描到一行把字段 m 的值拿出来再比对一下,筛选出满足条件的记录,这个查询是非常低效的...select * from t where m > 1000 and m < 3000; 再来看另一条 sql 语句,这个语句可以使用索引 k,所以该查询会先到二级索引 k 这个 B+ 树上,快速找到满足要求的叶子节点...推荐文章: mysql索引为啥要选择B+树 (上) python画哆啦A梦和大雄

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

    MySQL给字符串加索引

    MySQL是支持前缀索引的,前缀索引的优势就是占用的空间小,这同时带来的损失是,可能会增加额外的记录扫描次数。...,那这些语句就只能做全表扫描 MySQL 是支持前缀索引的,可以定义字符串的一部分作为索引。...默认地,如果你创建索引的语句不指定前缀长度,那么索引就会包含整个字符串。...在这个过程中,要回主键索引取 4 次数据,也就是扫描了 4 行。 所以使用前缀索引有可能会使查询语句读数据的次数变多 使用前缀索引,定义好长度,就可以做到既节省空间,又不用额外增加太多的查询成本。...有以下2中方式 就是使用倒序存储,比如身份证倒序,查询的时候再用函数转一下 以及使用hash字段,在表上创建一个整数字段,来保存身份证的校验码,同时在这个字段上加索引 这两种方式对比区别 从占用的额外空间来看

    5.5K71

    MySQL ORDER BY主键id加LIMIT限制走错索引

    ,大于49时就走PRIMARY主键索引。...report_product_sales_data_hq_code_orgz_id_index    PRIMARY 4  NULL    7624    Using where 开启优化器跟踪查看MySQL...由于自身的优化器选择,为了避免某些排序的消耗,可能会走非预期的PRIMARY主键索引; order by 和 limit 结合使用,如果where 字段,order by字段都是索引,那么有limit索引会使用...order by字段所在的索引,没有limit会使用where 条件的索引; 对于数据量比较大,而且执行量很高的分页sql,尽可能将所有的查询字段包括在索引中,同时使用索引来消除排序; 多用explain...查看是否使用到了最优索引; 利用optimizer trace查看优化器执行过程; 观察mysql的slow_query_log,及时做排查优化。

    2.6K10

    MySQL SQL优化之覆盖索引

    内容概要 利用主索引提升SQL的查询效率是我们经常使用的一个技巧,但是有些时候MySQL给出的执行计划却完全出乎我们的意料,我们预想MySQL会通过索引扫描完成查询,但是MySQL给出的执行计划却是通过全表扫描完成查询的...前些天,有个同事跟我说:“我写了个SQL,SQL很简单,但是查询速度很慢,并且针对查询条件创建了索引,然而索引却不起作用,你帮我看看有没有办法优化?”。...那为什么MySQL没有利用索引(uni_order_code)扫描完成查询呢?因为MySQL认为这个场景利用索引扫描并非最优的结果。我们先来看下执行时间,然后再来分析为什么没有利用索引扫描。...执行计划显示查询会利用覆盖索引,并且只扫描了1000行数据,查询的性能应该是非常好的。 执行时间:13ms ? 从执行时间来看,SQL的执行时间提升到原来的1/20,已经达到我们的预期。...要写出性能很好的SQL不仅需要学习SQL,还要能看懂数据库执行计划,了解数据库执行过程、索引的数据结构等。

    2.3K60

    MySQL索引与SQL语句优化

    在字段上计算不能命中索引, 10、强制类型转换会全表扫描,   如果phone字段是varcher类型,则下面的SQL不能命中索引。...13、建立索引的列不能为null,使用not null约束及默认值 14、利用延迟关联或者子查询优化超多分页场景, MySQL并不是跳过offset行,而是取offset+N行,然后放弃前offset...行,返回N行,那当offset特别大的时候,效率非常低下,要么控制返回的总数,要么对超过特定阈值的页进行SQL改写。...select id,name from product limit 866613, 20 使用上述SQL语句做分页的时候,可能有人会发现,随着表数据量的增加,直接使用limit分页查询会越来越慢。...SQL可以采用如下的写法:select id,name from product where id> 866612 limit 20。

    2.2K10

    【MySQL】MySQL中SQL语句的索引分析

    MySQL中SQL语句的索引分析 了解过 索引 的概念以及 B+树 的概念之后,我们就来看看怎么分析一条查询语句的索引使用情况。...相信不少同学应该都使用过 EXPLAIN 来分析 SQL 语句,但是具体到 EXPLAIN 中每个字段的作用,可能有不少同学还是会有点晕的。...const 根据主键或唯一索引进行等值查询时,MySQL 发现能对查询条件优化成常数时,访问方法就是 const 。常数级别也就是速度非常非常快,常见于主键等值查询。...不过某些情况下,MySQL 的优化器在计算到走索引还不如走全表时,也会直接使用全表扫描,以后我们踫到这种问题了再单独拿出来说吧。...参考文档: 《MySQL是怎样运行的》

    1.6K10

    MySQL SQL和索引优化总结

    专栏持续更新中:MySQL详解 首先我们需要知道MySQL主要是从以下3个方面进行优化: SQL语句和索引 应用优化(引入缓存、连接池) 配置参数优化 一、SQL语句和索引的优化 当数据量比较大,若SQL...语句写的不合适,会导致SQL的执行效率低,我们需要等待很长时间才能拿到结果 针对性优化的时候,若数据量太大,可通过limit分页 explain分析的时候可能出现以下问题: 没有用索引 用多列索引没有用到第一列...,导致没用到索引 联合查询的大小表设置不合理,导致索引没用上(小表是整表查询,大表才用索引) 多表查询不用in(产生中间表),用外连接替代带in子查询的过程,合理使用索引 二、应用优化 除了优化SQL和索引...MySQL查询缓存 MySQL的查询缓存是把上一次select的查询结果记录下来放在缓存当中,下一次再查询相同内容的时候,直接从缓存中取出来就可以了,不用再进行一遍真正的SQL查询(在内存中划分一块空间用做缓存的地方...SQL请求就可以了,执行完成后,不销毁线程,而是把线程再归还到线程池中,等待下一次任务的处理(线程池的线程数量随着请求越来越多,是可以动态增加的) 配置完thread_cache_size,重启MySQL

    61450

    SQL优化 MySQL版 – 索引分类、创建方式、删除索引、查看索引、SQL性能问题

    索引分类 单值索引 单的意思就是单列的值,比如说有一张数据库表,表内有三个字段,分别是 id name age,我给age这个字段加一个索引,这就是单值索引,因为只有age这一列是索引; 一个表可以有多个单值索引...注意: 如果一个字段是primary key(主键),则该字段默认就是主键索引,即便你没有给他加索引,他也是主键索引! 主键索引与唯一索引基本相似,区别就是,值不能为Null,而唯一索引可以!...explain,可以模拟SQL优化器执行SQL语句,从而让开发人员知道自己编写的状况; 查询执行计划:explain+SQL语句; 举例:explain select * From bbs_detail...key_len:实际使用索引的长度; ref:表和表之间的引用关系; rows:通过索引查询到的数据量; Extra:额外的优化信息 2.MySQL查询优化器会干扰我们的优化 我在前几章说过有关为什么会干扰我们优化好的...SQL语句,因为它内置有一个优化器,它会擅自篡改我们优化好的SQL语句;

    1.7K10

    Mysql中哪些Sql不走索引

    要尽量避免这些不走索引的sql: SELECT `sname` FROM `stu` WHERE `age`+10=30;– 不会使用索引,因为所有索引列参与了计算 SELECT `sname` FROM...` LIKE’金蝶%’ — 走索引 SELECT * FROM `houdunwang` WHERE `uname` LIKE “%金蝶%” — 不走索引 — 正则表达式不使用索引,这应该很好理解,所以这就是为什么在...SQL中很难看到regexp关键字的原因 — 字符串与数字比较不使用索引; CREATE TABLE `a` (`a` char(10)); EXPLAIN SELECT * FROM `a` WHERE...`a`=”1″ — 走索引 EXPLAIN SELECT * FROM `a` WHERE `a`=1 — 不走索引,同样也是使用了函数运算 select * from dept where dname...换言之,就是要求使用的所有字段,都必须建立索引,我们建议大家尽量避免使用or 关键字 — MySQL内部优化器会对SQL语句进行优化,如果优化器估计使用全表扫描要比使用索引快,则不使用索引

    2.1K20

    PolarDB MySQL 加索引卡主的整体解决方案

    在使用PolarDB for MySQL的过程中,我们遇到一个问题,PolarDB 8.02的小版本8.02.2.24 在添加索引的时候,会有部分情况无法添加索引,添加索引失败。...具体表现是如下图: 在添加索引后会停滞,如果你等不及,直接KILL 添加索引的会话(实际上不KILL长时间也会索引添加失败),则BUG触发,稍后会返回如下报错信息,然后在怎么添加索引都不在报错而是直接无响应...故障的原理是 1 在添加索引的情况下,基于POLARDB的原理,shared storage的架构,所以主从是一个存储,在这样的情况下,如果在主库将添加索引的SESSION KILL,会卡主,因为主库和从库之间有线程...2 解决方案只能强行重启从节点,给主库一个信号,然后如果此时在建立索引则会建立索引立即成功。...在排查POLARDB FOR MySQL的数据库时,可以利用如下的命令 /force_node='p-2zexq8l8pzx8m6i'/ select * from information_schema.processlist

    60900

    这句简单的sql,如何加索引?颠覆了我多年的认知

    请问下面的sql语句,要想加快查询速度,该怎么创建索引?以下,以mysql数据库为准。 select * from test where a=? and b>?...explain select * from test where a>10 and b >10 order by c 首先,我们拿上面的sql语句进行验证。...2、指定索引 接下来使用force index方式,强制指定索引。 这里直接给出结果,就是下面的sql。...using filesort 说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序”。...我想,mysql并不能够了解到这两个过程,到底谁快谁慢,于是选了一个最通用的方式,直接选用了第一种。甚至在索引非常多的时候,直接晕菜了。索引建多了,你可能间接把mysql给害了。

    92040

    SQL笔记(2)——MySQL的表操作与索引

    在SQL中,修改表中某一列的数据类型是一个重要的操作,因为数据类型决定了该列可以存储的数据种类和范围。...什么是索引 MySQL索引是一种帮助MySQL快速获取数据的数据结构,就像是书的目录一样可以快速访问特定信息。...主键索引:索引列中的值必须是唯一的,不允许有空值。 普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值。 唯一索引:索引列中的值必须是唯一的,但是允许为空值。...MyISAM和InnoDB中都可以使用全文索引。 空间索引:MySQL在5.7之后的版本支持了空间索引,而且支持OpenGIS几何数据模型。...MySQL在空间索引这方面遵循OpenGIS几何数据模型规则。 前缀索引:在文本类型如CHAR,VARCHAR,TEXT类列上创建索引时,可以指定索引列的长度,但是数值类型不能指定。

    2.5K30

    SQL索引

    一、索引概述 介绍: 索引是帮助MySQL高效获取数据的数据结构(有序)。...FROM table_name; 删除索引 DROP INDEX index_name ON table name; 五、SQL性能分析 (一)SQL执行频率 MySQL客户端连接成功后,通过show...MySQL的慢查询日志默认没有开启,需要在MySQL的配置文件(/etc/my.cnf)中配置如下信息: #开启MySQL慢日志查询开关 slow query log=1 #设置慢日志的时间为2秒,SQL...通过nave profiling参数,能够看到当前MySQL是否支持 profile操作: SELECT @@have profiling; 执行一系列的业务SQL的操作,然后通过如下指令查看指令的执行耗时...query_id的SQL语句CPU的使用情况 show profile cpu for query query_id; (四)explain执行计划 EXPLAIN或者DESC命令获取MySQL如何执行

    76020

    从一次sql优化谈mysql索引

    使用了seller_id索引,扫描了106184行。 2:新sql改造 基于上述老的查询sql,我们做了以下改造: 索引 1:基本概念 首先看一下sql查询的执行过程: ?...客户端先发送一条查询给服务器; 服务器先检查查询缓存,如果命中了缓存,则立刻返回给存储在缓存中的结果,否则进入下一个阶段; 服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划; MySQL 根据优化器生成的执行计划...老sql执行过程 解析sql,生成执行计划,选择seller_id索引树执行查询 扫描了10684行记录找到记录 回表从主键索引树取出50条数据,选择50条返回(偏移量从0开始50条,如果偏移量从10000...sql优化 根据具体的查询场景和诉求,对sql进行改造,或者适当调整索引,从而短期提供单表高性能响应,并且此方案没有额外的机器成本,只需要对底层sql检索语句进行优化,当然这也需要更高的认知成本

    1.4K62

    SQL优化 MySQL版 – B树索引详讲

    为什么要进行SQL优化呢?...很显然,当我们去写sql语句时: 1会发现性能低 2.执行时间太长, 3.或等待时间太长 4.sql语句欠佳,以及我们索引失效 5.服务器参数设置不合理 SQL语句执行过程分析 1.编写过程: 编写过程就是我们平常写...,查这个“王”之前先去翻看目录,发现“W”在300页,因为王首字母是“W”,我们直接去在300页中找,这样找起来就非常快; 索引在数据库中是关键字insex,用官方的定义的意思来说,索引就是帮助MySQL...其实它就是一个树,我们用的比较多的就是B树、Hash树,在MySQL里面,用的就是B树索引; B树索引 首先我画一个图,假装这个是数据表,并且给age列加一个索引: 就把这个索引当成一个目录,也就是age...,不加索引就一个个去找; 如果加索引的话,找33,发现33比50小,第一次,再去找23,第二次,33比23大,第三次,仅需三次就查到了: 索引的弊端 1.索引本身很占空间,可以存放在内存/硬盘(通常)

    46610
    领券