首页
学习
活动
专区
圈层
工具
发布
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    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.4K71

    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.2K60

    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.5K10

    MySQL SQL和索引优化总结

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

    60050

    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

    oracle创建索引的sql语句_mysql创建组合索引

    创建索引一般分为在线索引和非在线索引,在线与非在线的区别:非在线锁表,优先创建索引,此时DML都被阻塞,所以快;相反,在线锁的是行而非表,通过临时表进行索引的创建,所以不会影响DML操作,但副作用就是慢...如果在生产环境操作,不停服务的话,势必导致创建索引期间仍有DML操作进来。另外如果是大表,那么采用非在线而导致锁表所带来的影响可能会很大。一句话,生产环境不停服的脚本操作,建议使用online。...1、创建索引。...DROP INDEX 索引名; 4、查看某个表的索引,表名需大写。 SELECT * FROM ALL_INDEXES WHERE TABLE_NAME = '表名' 5、查看某个表哪些列有索引。...SELECT * FROM ALL_IND_COLUMNS WHERE TABLE_NAME = '表名' 如果在where 子句中有OR 操作符或单独引用复合索引列的后面列则将不会走索引,将会进行全表扫描

    5.4K20

    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语句进行优化,如果优化器估计使用全表扫描要比使用索引快,则不使用索引

    2K20

    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

    57900

    mysql索引abc,a=1 and c=2是否可使用索引_sql联合索引

    在一次查询中,MySQL只能使用一个索引。 在真实项目中,SQL语句中的WHERE子句里通常会包含多个查询条件还会有排序、分组等。...MYSQL中常用的强制性操作(例如强制索引) https://www.jb51.net/article/49807.htm SELECT * FROM TABLE1 FORCE INDEX (FIELD1...bc 的时候用不到abc和ac 索引。...使用联合索引应该注意: MySQL使用联合索引只能使用左侧的部分,例如INDEX(a,b,c),当条件为a或a,b或a,b,c时都可以使用索引,但是当条件为b,c时将不会使用索引。...离散度更高的索引应该放在联合索引的前面,因为离散度高索引的可选择性高。考虑一种极端的情况,数据表中有100条记录,若INDEX(a,b)中a只有两种情况,而b有100种情况。

    2.2K10

    这句简单的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给害了。

    91140

    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如何执行

    72220

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

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

    2.5K30
    领券