精华内容
下载资源
问答
  • mysql索引建立规则

    2021-04-23 15:59:02
    比如可以设计一个或者两三个联合索引(尽量少建单值索引),让每一个联合索引都尽量去包含sql语句里的where、order by、group by的字段,还要确保这些联合索引的字段顺序尽量满足sql查询的最左前缀原则。 3、不要在小...

    索引设计原则

    1、代码先行,索引后上

    先完善业务,之后再运行中发现某些sql过慢,拿出来分析之后再给该表添加索引

    2、联合索引尽量覆盖条件

    比如可以设计一个或者两三个联合索引(尽量少建单值索引),让每一个联合索引都尽量去包含sql语句里的where、order by、group by的字段,还要确保这些联合索引的字段顺序尽量满足sql查询的最左前缀原则。

    3、不要在小基数字段上建立索引

    如果一个字段,例如性别字段只有两个值,那么给它建立索引没有实际效果,因为二分查找只有两个值,还不如去全表扫描。可以给多个值的列建立索引,这样二分查找效率就比较高。可以发挥B+树的二分查找的优势

    4、长字符串我们可以采用前缀索引

    尽量对字段类型较小的列设计索引,比如说什么tinyint之类的,因为字段类型较小的话,占用磁盘空间也会比较小,此时你在搜索的时候性能也会比较好一点。

    当然,这个所谓的字段类型小一点的列,也不是绝对的,很多时候你就是要针对varchar(255)这种字段建立索引,哪怕多占用一些磁盘空间也是有必要的。

    对于这种varchar(255)的大字段可能会比较占用磁盘空间,可以稍微优化下,比如针对这个字段的前20个字符建立索引,就是说,对这个字段里的每个值的前20个字符放在索引树里,类似于 KEY index(name(20),age,position)。

    此时你在where条件里搜索的时候,如果是根据name字段来搜索,那么此时就会先到索引树里根据name字段的前20个字符去搜索,定位到之后前20个字符的前缀匹配的部分数据之后,再回到聚簇索引提取出来完整的name字段值进行比对。

    但是假如你要是order by name,那么此时你的name因为在索引树里仅仅包含了前20个字符,所以这个排序是没法用上索引的, group by也是同理。所以这里大家要对前缀索引有一个了解。

    5、where与order by冲突时优先where

    where可以先过滤出来数据,再根据该数据进行排序,所需排序的数据量变少,效率会更好

    6、基于慢sql查询做优化

    可以根据监控后台的一些慢sql,针对这些慢sql查询做特定的索引优化。

    展开全文
  • Q: 这个问题蛮有意思的,在什么时候建立联合索引(a,b)但是却需要单独建立一个冗余索引a呢? Q: 一个字段只有0/1怎么加快搜索? Q: 加入索引的缺点? Q:如果知道了a还是b那个查询其来块,那么使用强制索引。 Q...

    目录

    1.什么是覆盖索引?

    2.什么是联合索引?

    2.1 联合索引的顺序要注意什么?

    3. 索引下推优化?

    总结:

    最左原则在like中也可以加速检索。

    Q: 这个问题蛮有意思的,在什么时候建立了联合索引(a,b)但是却需要单独建立一个冗余索引a呢?

    Q: 一个字段只有0/1怎么加快搜索?

    Q: 加入索引的缺点?

    Q:如果知道了a还是b那个查询其来块,那么使用强制索引。

    Q:创建表的时候创建索引

    Q: 为什么有时候需要重建索引?

    Q:重建索引的语句?

    Q:MRR是什么?

    Q:使用between有时候比in所有的范围要快!!

    Q:ICP索引下推的一个实例问题?


    前言:

    索引的建立很重要,对于联合索引的顺序的考究,还需要更多的实战才能去体会。

    1.什么是覆盖索引?

    在去索引表搜索的时候,想要查询的信息就在二级索引树上面,

    这个就叫做覆盖索引。

    可以不用回表查询,可以提高查询性能

    2.什么是联合索引?

    联合索引就是多个条件列 组合的索引

    因为索引是B+树,那么最早找的最左面的索引,来确定节点。

    然后在去根据下一个条件b 确定下一个方向,

    所以是一步一步的锁定的~

    2.1 联合索引的顺序要注意什么?

    注意的点是空间上的问题,字段的大小问题。

    注意原则:联合索引范围查询的话,尽量放在最后面。(范围查询如果放在最前面性能会很差)

    索引最左列最好还是使用选择性高的列!!特征点明显的

    都是等值查询的话,那么无所谓索引顺序也可以进行命中。

    (但是有了索引的下推,这个顺序也不需要在意咯~)

    比如范围查询select * from table where a=xx,b>xx;

    那么如果是(a,b)效率会很高。但是如果是(b,a)就相当于只有范围用到了索引,a是没法用到索引的必须回表查询。

     

    3. 索引下推优化?

    在mysql5.6之前,如果 建立了联合索引(name, city)

    select * from tuser where name like '朱%' and sex =1 and city = "beijing";

    那么根据前缀索引会检索出来姓朱的找到第一个符合条件的索引对应的数据页,然后去数据页里面遍历,找到每一个的索引带的主键的值,回表遍历去。

    但是在5.6之后,出现了索引下推。(index condition pushdown)

    对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

    嗯其实就是在查询的时候,判断联合索引中的city,符不符合beijing

    然后不符合就不回表查询了~

    这就是重要的索引下推~

    总结:

    最左原则在like中也可以加速检索。

    like查询的时候,比如:你要查的是所有名字第一个字是“朱”的人,你的 SQL 语句的条件是"where name like ‘朱%’"那么如果给这个字段加上索引也是可以用到的。因为快速定位到这个索引,然后去数据页去遍历,知道不满足条件的为止。

    索引的最左前缀原则,可以加速检索。这个最左原则可以是联合索引的最左的N个字段,也可以是索引的最左M个字符。

    Q: 这个问题蛮有意思的,在什么时候建立了联合索引(a,b)但是却需要单独建立一个冗余索引a呢?

    这个问题根据高性能mysql中说的,是因为加上了联合索引b导致了条件只有a的时候,查询速度变慢很多。

    我猜可能是因为B的站的字节数很大,导致了索引树很大,所以哪怕是冗余,也需要解决这个问题。

    Q: 一个字段只有0/1怎么加快搜索?

    一般都不会对这种字段建立索引。

    但是呢,如果0和1这种分布很不均匀的情况,比如0 有100条,但是1有1w条,我给这个字段建立索引就会快很多。

    这样的话,就可以直接定位到0所在的数据页。如果像男女一半对一半,那么就索引没什么用。

    Q:查询条件的先后顺序有很大的作用么?

    看大佬们的回答,是看MYSQL版本的。

    从某个版本之后,条件顺序对索引的选取没有影响了。

    查询优化器会优化执行计划。

     

    因为是执行sql语句的时候,mysql是有查询优化器的。

    查询优化器会将sql 进行优化,选择最优的查询计划来执行

    Q: 加入索引的缺点?

    增加占用的空间,降低插入的速度。

    Q:如果知道了a还是b那个查询其来块,那么使用强制索引。

    如果经常有这种查询, 建议建个a 和 b的联合索引,是最有效的优化。
    不建联合索引,两列又都有索引时,mysql会有采取自己的算法去选区最快点索引,
    如果你很清楚,从a还是b查起来更快, 可以使用强制索引FORCE INDEX (FIELD1)
    多用 explain去观察, 优化sql

    TIPS:如果数据库的字段长度很固定,使用char类型不要使用varchar 会速度快一点~

    Q:创建表的时候创建索引

    使用key关键字~

    PRIMARY KEY `a`, KEY `c` (`c`)

    这个c就是索引咯~

    例如:

    CREATE TABLE 表名(字段名 数据类型 [完整性约束条件], [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY [索引名](字段名1 [(长度)] [ASC | DESC]) );

    Q: 为什么有时候需要重建索引?

    索引可能因为删除,或者页分裂等原因,导致数据页有空洞,重建索引的过程会创建一个新的索引,把数据按顺序插入,这样页面的利用率最高,也就是索引更紧凑、更省空间。

    重建索引 k 的做法是合理的,可以达到省空间的目的。但是,重建主键的过程不合理。不论是删除主键还是创建主键,都会将整个表重建。

    Q:有的表数据需要删除,但是索引数据确还在。这时候使用语句alter table T engine=InnoDB

    重新建表才能重建索引,并不能通过清除数据释放。

    Q:重建索引的语句?

    alter table T drop index k;alter table T add index(k);

    Q:MRR是什么?

    MRR 索引多范围查找,https://www.cnblogs.com/xibuhaohao/p/10796113.html

    如果基表很大,数据没有被缓存,在二级索引上使用范围扫描读取行可能会导致大量的随机磁盘访问。使用Multi-Range Read新特性,mysql可以减少对磁盘的随机读的次数:首先,mysql只是扫描索引,收集相关行的keys;然后,将收集到的keys进行排序;最后通过有序的主键去访问基表。

    Q:使用between有时候比in所有的范围要快!!

    1.select * from T where k in(1,2,3,4,5)
    2.select * from T where k between 1 and 5

    第一个语句要搜索树5次,第二个搜索一次。

    Q:ICP索引下推的一个实例问题?

    “a > 5 and a < 10 and b='123'”在ICP作用下的执行过程是什么样子的?

       a) 把 a>5 and b='123'传入引擎,
       b)引擎找到第一个a>5的行(这里是快速定位),如果发现b<>'123',找下一个,直到满足b='123',
      c)把找到的行返回给server层, server层根据a是否小于10决定要不要取下一个

    也就是server层把a>5执行一次,a>6执行一次。。。。

     

    展开全文
  • 数据库索引怎么建,什么时候用到 索引优缺点:为主键外建where子句建立索引可以加速数据库查询,但是索引占用内存,同时update和insert的时候需要同步修改;索引的实现通常使用其变种B+树。 建立索引方式:create index ...

     

    数据库索引怎么建,什么时候用到

    索引优缺点:为主键外建where子句建立索引可以加速数据库查询,但是索引占用内存,同时update和insert的时候需要同步修改;索引的实现通常使用其变种B+树

    建立索引方式:create index 索引名 on 表名(列名);

    细节问题:

    1. )如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命性的结果下降,每次查找一条特定的数据都会进行一次全表扫描
    2. )防止过度索引,比如性别只有两个值,此时对该列建立索引不仅没有什么优势,反而会影响更新插入等操作的速度.

         3.)如果where条件进行了联合查询,则可以使用复合索引,如:

    Select * from users where area=”beijing” and age=22;此时可以对area和age建立联合主键,而不是单单对area做索引,因为联合索引更加迅速

    如果我们创建了(area,age,salary)复合主键,此时其实相当于创建了(area,age,salary),(area,age),(area)三个索引,这被称为最佳左前缀;因此在建立主键的时候应该将最常用的结果并且字段类型比较小的字段放在前面.

    1. 索引不会含有null值得列,如果复合索引中只要有一列含有null值,那么这一列在复合索引中就是无效的.
    2. Mysql查询中只使用一个索引,如果where子句中已经使用了索引,那么order by中的列是不会使用索引的.如果排序使用了多个列,可以考虑复合索引
    3. 对于like “%a%”不会使用索引,但是类似 like “aa%”可以使用索引

     

    哪些字段适合添加索引:

    1、表的主键、外键必须有索引;

    2、数据量超过300的表应该有索引;

    3、经常与其他表进行连接的表,在连接字段上应该建立索引

    4、经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;

    5、索引应该建在选择性高的字段上;

    6、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;

    7复合索引的建立需要进行仔细分析;尽量考虑用单字段索引代替:

    A、正确选择复合索引中的主列字段,一般是选择性较好的字段;

    B、复合索引的几个字段是否经常同时以AND方式出现在Where子句中?单字段查询是否极少甚至没有?如果是,则可以建立复合索引;否则考虑单字段索引;

    C、如果复合索引中包含的字段经常单独出现在Where子句中,则分解为多个单字段索引;

    D、如果复合索引所包含的字段超过3个,那么仔细考虑其必要性,考虑减少复合的字段;

    E、如果既有单字段索引,又有这几个字段上的复合索引,一般可以删除复合索引;

    F、如果(a,b,c)是联合索引,where a='a' and b>'b' and c='c',那么c实际不会走索引。

    8、频繁进行数据操作的表,不要建立太多的索引;

    9、删除无用的索引,避免对执行计划造成负面影响;

     

    上面说明了联合索引和多个单字段索引分别在什么情况下使用:

    1. 复合索引的几个字段是否经常同时以AND方式出现在Where子句中
    2. 单字段查询是否极少甚至没有

    如果上面两个答案都是‘是’则使用联合索引

    对字符串建索引的注意点:


    如果字符串长度比较长,会导致索引占用内存比较大,但是如果只去字段的一部分作为索引,又会降低索引区分度。矛盾了

    1前(后)缀索引
    1.1会降低区分度,可以使用类似count(distinct(left(table_name,5))) as l5来统计
    1.2导致覆盖索引无法正常使用
    2增加字段的hash值作为一列,然后使用该列建索引,无法使用等值查询

    执行计划

    如果建了索引之后不确定效果,可以使用mysql自带的执行计划看下索引效果,下面介绍执行计划的使用

    Sql写法:

    explain tbl_name
    explain [extended] select select_options

    前者可以得出一个表的字段结构等等,后者主要是给出相关的一些索引信息,而今天要讲述的重点是后者。

    id

    SELECT识别符。这是SELECT的查询序列号

    select_type

    SELECT类型,可以为以下任何一种:

    • SIMPLE:简单SELECT(不使用UNION或子查询)
    • PRIMARY:最外面的SELECT
    • UNION:UNION中的第二个或后面的SELECT语句
    • DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询
    • UNION RESULT:UNION 的结果
    • SUBQUERY:子查询中的第一个SELECT
    • DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询
    • DERIVED:导出表的SELECT(FROM子句的子查询)

    table

    输出的行所引用的表

    type

    联接类型。下面给出各种联接类型,按照从最佳类型到最坏类型进行排序:

    • system:表仅有一行(=系统表)。这是const联接类型的一个特例。
    • const:表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。const表很快,因为它们只读取一次!
    • eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。
    • ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。
    • ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。
    • index_merge:该联接类型表示使用了索引合并优化方法。
    • unique_subquery:该类型替换了下面形式的IN子查询的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。
    • index_subquery:该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr)
    • range:只检索给定范围的行,使用一个索引来选择行。
    • index:该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。
    • ALL:对于每个来自于先前的表的行组合,进行完整的表扫描。对于较大的表必须避免

    possible_keys

    指出MySQL能使用哪个索引在该表中找到行

    key

    显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。

    key_len

    显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。

    ref

    显示使用哪个列或常数与key一起从表中选择行。

    rows

    显示MySQL认为它执行查询时必须检查的行数。多行之间的数据相乘可以估算要处理的行数。

    filtered

    显示了通过条件过滤出的行数的百分比估计值。

    Extra

    该列包含MySQL解决查询的详细信息

    • Distinct:MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
    • Not exists:MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。
    • range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。
    • Using filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行。
    • Using index:从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。
    • Using temporary:为了解决查询,MySQL需要创建一个临时表来容纳结果。
    • Using where:WHERE 子句用于限制哪一个行匹配下一个表或发送到客户。
    • Using sort_union(...), Using union(...), Using intersect(...):这些函数说明如何为index_merge联接类型合并索引扫描。
    • Using index for group-by:类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查 询GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。

    Using filesort:如果mysql在排序的时候没有使用到索引那么就会输出using filesort。sql中order by/group by都会要求数据的排序
    Using Temporary:数据需要排序,就要先取出来,取出来放到磁盘临时文件或者内存中。MySQL根据sort_buffer_size来判断是否使用磁盘临时文件,如果需要排序的数据能放入sort_buffer_size则无需使用磁盘临时文件,仅仅使用内存就可以了,此时explain只会输出using filesort 否则需要使用磁盘临时文件explain会输出using temporary;using filesort;这里需要指出:如果使用了磁盘临时文件,那么就需要磁盘IO(很慢),肯定会拉慢sql的执行效率,需要避免。

    可选索引有多个时,怎么选择?

    主键索引优先于一般索引
    选择索引基数大,扫描行数小的索引

    索引基数怎么预估?扫描行数怎么预估?
    统计总页数,抽样n个页获取每个页的平均基数
    根据基数来预估扫描行数
    主键索引优先于一般索引

    为什么需要索引重建

    索引可能因为删除,或者页分裂等原因,导致数据页有空洞,重建索引的过程会创建一个新的索引,把数据按顺序插入,这样页面的利用率最高,也就是索引更紧凑、更省空间。

    这道题目,我给你的“参考答案”是:

    偶尔重建非主键索引 k的做法是合理的,可以达到省空间的目的。但是,重建主键的过程不合理。不论是删除主键还是创建主键,都会将整个表重建。所以连着执行这两个语句的话,第一个语句就白做了。这两个语句,你可以用这个语句代替 : alter table T engine=InnoDB。

    索引下推

    联合索引(name, age)为例。如果现在有一个需求:检索出表中“名字第一个字是张,而且年龄是 10 岁的所有男孩”。那么,SQL 语句是这么写的:

     

    mysql> select * from tuser where name like '张 %' and age=10 and ismale=1;

    你已经知道了前缀索引规则,所以这个语句在搜索索引树的时候,只能用 “张”,找到第一个满足条件的记录 ID3。当然,这还不错,总比全表扫描要好。

    然后呢?

    当然是判断其他条件是否满足。

    在 MySQL 5.6 之前,只能从 ID3 开始一个个回表。到主键索引上找出数据行,再对比字段值。

    而 MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数。

    下面是无索引下推,会回表四次,如下图

    有索引下推,仅仅回表两次,会先把age为30和20的过滤掉,如下图

     

    说明:索引下推 借鉴于极客时间 mysql实战45讲。

     

    展开全文
  • MySQL索引

    2019-08-05 19:09:25
    文章目录1. 什么是索引?2.索引是个什么样的数据结构?...7.联合索引是什么?为什么需要注意联合索引中的顺序?8.创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因(慢SQL排查)...

    1. 什么是索引?

    索引是一种数据结构,可以帮助我们快速的进行数据的查找

    2.索引是个什么样的数据结构?

    索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引、B+ 树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为B+ 树索引。

    3.Hash索引和B+树索引有什么区别或优势?

    • Hash索引底层实现原理:

    Hash索引底层就是Hash表,进行查找时,调用一次Hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据。

    • B+树索引底层实现原理:

    B+树索引底层实现是多路平衡查找树,对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据。、

    • 1.Hash索引进行等值查询更快(一般情况下),无法进行范围查询。

    在Hash索引中经过Hash函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询;B+树索引的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围查询。

    • 2.Hash索引不支持使用索引进行排序。

    原理同上

    • 3.Hash索引不支持模糊查询以及多列索引的最左前缀匹配。

    Hash函数的不可预测,AAAA和AAAAB的索引没有相关性。

    • 4.Hash索引任何时候都避免不了回表查询数据,而B+ 树索引在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询。

    • 5.Hash索引虽然在等值查询上较快,但是不稳定,性能不可预测 ,当某个键值存在大量重复的时候,发生Hash碰撞,此时效率可能极差。而B+树的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,且树的高度较低。

    因此,在大多数情况下,直接选择B+ 树索引可以获得稳定且较好的查询速度。而不需要使用Hash索引。

    4.B+树索引在满足聚簇索引和覆盖索引的时候不需要回表查询数据,什么是聚簇索引?

    在B+树的索引中,叶子节点可能存储了当前的Key值,也可能存储了当前的Key值以及整行的数据,这就是聚簇索引,否则就是非聚簇索引。
    在InnoDB中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引;如果没有唯一键,则隐式生成一个键来建立聚簇索引。
    当查询使用聚簇索引时,在对应的叶子节点,可以获取到整行数据,因此不用再次进行回表查询。

    5.非聚簇索引一定要回表查询吗?

    不一定,涉及到查询语句所要求的字段是否全部命中了索引,如果全部命中了索引,那么就不必再进行回表查询。
    example:
    假设在员工表的年龄上建立了索引,那么当进行:

    select age from employee where age < 20;
    

    查询索引时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询。

    6.在建立索引的时候,都有哪些需要考虑的因素?

    建立索引的时候一般要考虑到字段的使用频率,经常作为条件进行查询的字段比较适合做索引;
    如果需要建立建立联合索引的话,还需要考虑联合索引中的顺序,此外还要考虑其他方面,比如防止过多的所有对表造成太大的压力,这和实际的表结构以及查询的方式有关。

    7.联合索引是什么?为什么需要注意联合索引中的顺序?

    MySQL可以使用多个字段同时建立一个索引,称为联合索引。
    在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。

    MySQL使用索引时需要索引有序,假设现在建立了name、age、school的联合索引,name索引的排序为:
    先按照name排序,如果name相同,则按照age排序,如果age的值也相等,则按照school进行排序。
    当进行查询时,此时索引仅仅按照name严格有序,因此必须首先使用name字段进行等值查询,因此必须首先使用name字段进行 等值查询,之后对于匹配到的列而言,其按照age字段严格有序,此时可以使用age字段用做索引查找…以此类推。

    因此在建立联合索引的时候应该注意索引列的顺序,一般情况下,将查询需求频繁或者字段选择性高的累放前面。
    此外,可以根据特例的查询或者表结构进行单独的调整。

    8.创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因(慢SQL排查)?

    MySQL提供了explain命令来查看语句的执行计划。
    MySQL在执行某个语句之前,会将该语句过一遍查询优化器,之后会拿到对语句的分析,也就是执行计划,其中包含了许多的信息,可以通过其中和索引有关的信息来分析是否命中了索引。
    例如:
    possible_key,key,key_len等字段,分别说明了此语句可能会使用的索引,实际使用的索引以及使用的索引长度。

    9.在哪些情况下会发生针对某列创建了索引但是在查询的时候并没有使用使用呢?

    1.使用了不等于查询;
    2.类参与了数学运算或者函数;
    3.在字符串like时左边是通配符,类似于%hello
    4.当MySQL分析全表扫描比使用索引快的时候不使用索引;
    5.当使用联合索引,前面一个条件为范围查询,后面的即使符合最左前缀原则,也无法使用索引。

    展开全文
  • MySQL索引原理解析

    2020-11-29 23:20:00
    前言 MySQL提升查询效率的一种特别高效的方式就是建立索引,那么MySQL是...联合索引:基于多个字段建立的索引 我们在某个字段上建立一个索引后,服务端会做什么操作呢? 本文介绍MySQL5.7版本之后默认的存储引擎inn
  • 面试题一:mysql中数据量大查询到后面导致分页慢,什么原因?怎么优化?(十分重要) 慢的原因:数据量大的时候查询到后面越来越慢,比如limit 1000000,10也就是查询10000010行数据,抛弃1000000行数据...建立联合索.
  • mysql索引优化策略

    2020-06-24 19:46:39
    建立索引的时候我们还可以使用索引覆盖,这个索引覆盖怎么用,一般来说是通过联合索引来使用的。由于mysql索引下推的优化,索引覆盖不需要回表。 建立索引的时候一般而言是用自增主键作为索引,这样做的好处是减少...
  • 文章目录提高MySQL查询效率视图什么是视图特点视图的使用索引(index)索引与存储引擎索引的分类查询索引建立索引索引的优点索引的缺点普通索引唯一索引主键索引联合索引全文索引总结 提高MySQL查询效率 查询语句也...
  • MySQL如何建议优秀的索引

    万次阅读 2020-06-04 08:17:11
    (3) 最好使用唯一值多的列作为联合索引前导列,其他的按照联合索引优化细节来做 (4) 列值长度较长的索引列,我们建议使用前缀索引. (5) 降低索引条目,一方面不要创建没用索引,不常使用的索引清理,percona toolkit...
  • 总共有:交集、并集以及他们的组合,但是索引合并并非是一种合适的选择,因为在做索引合并时可能会消耗大量的CPU和内存资源,一般用到索引合并的情况也从侧面反映了该表的索引需要优化,可以尝试建立联合索引。...
  • select * from table where a=1 and b=2 and c=3,要怎么建立索引,才可以确保这个SQL语句能使用到索引来进行查询? 答:引入索引最左前缀匹配原则的概念:与联合索引相关联,很多时候索引是针对几个字段来建立的; ...
  • MySQL针对主键索引会维护一个B+树的结构,这个我们称之为聚簇索引,针对非主键(一般都是建立联合索引)会对索引字段依次排序,然后从第一个字段值开始比较,第一个字段值相同就针对下一个字段值进行比较,依次...
  • MYSQL

    千次阅读 2019-09-05 15:31:06
    目录索引1.什么是索引2.创建索引3.索引的分类4.索引是个什么样的数据结构呢?5.Hash索引和B+树索引有什么区别或者说优劣呢?...为什么需要注意联合索引中的顺序?10.创建的索引有没有被使用到?或者说怎么才可以知...
  • Mysql3

    2021-06-16 20:21:24
    4.联合索引底层数据结构又是怎么样的 5.聚集索引与覆盖索引到底是什么 6.mysql最左前缀优化原则是怎么回事 7.为什么DBA总推荐使用自增主键做索引 8.阿里巴巴Mysql索引优化军规 MyISAM存储引擎索引实现 M
  • [MYSQL]mysql的优化思路

    2020-06-17 15:38:22
    索引相关:怎么建立索引?联合索引和覆盖索引? 数据页相关:页分裂,页合并,索引重建 语句相关:使用count(1),使用join的须知,使用group by 和order by 的须知,多用 limit,尽量不使用NOT IN和like语句操作,...
  • mysql 面试题

    2019-10-10 12:57:33
    文章目录1.索引相关1.什么是索引2.索引是什么样的数据结构3.Hash...为什么需要注意联合索引中的顺序8.创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因9.何时索引失效2.事务相关1.什么是事务...
  • 使用联合索引要注意想要命中索引需要按照建立索引的字段顺序挨个使用,否则无法命中, 创建的索引有没有被使用到,怎么样才能知道这条sql运行很慢呢? 可以使用explain命令来查询语句的执行过程,mysql在执行一条...
  • MySql 面试高频100问

    2020-01-08 16:42:45
    文章目录索引相关1. 什么是索引?2. 索引是个什么样的数据结构呢?3. Hash索引和B+树所有有什么区别或者说...7. 联合索引是什么?为什么需要注意联合索引中的顺序?8. 创建的索引有没有被使用到?或者说怎么才可以知道...
  • mysql——调优的问题

    2021-04-22 20:54:35
    联合索引 最左匹配原则 索引下推 唯一索引普通索引选择难题 前缀索引 条件字段函数操作 隐式字符编码转换 flush 1.什么是数据库调优? 所谓的调优,就是在执行器执行之前的分析器、优化器阶段完成的。 1.覆盖索引...
  • MySQLDBA运维笔记.pdf

    2019-11-04 15:53:17
    mysql 总结........................................................................................................................................6 1.1 数据库的种类.......................................
  • 朋友问: 5000万数据的一张表,怎么去重快,根据两个字段判断是否重复。 回复之: ...把2个字段以及主键id select 出来建立一张临时表t1, ...t1建立好主键索引以及2个对比的字段联合索引。 ...
  • 回复之:把2个字段以及主键id select 出来建立一张临时表t1,t1建立好主键索引以及2个对比的字段联合索引。 然后在临时表里面 比对重复的记录,把重复的记录录入第二张临时表t2,t2表结构和t1一模一样。 然后根据你...
  • MySQL针对主键索引会维护一个B+树的结构,这个我们称之为聚簇索引,针对非主键(一般都是建立联合索引)会对索引字段依次排序,然后从第一个字段值开始比较,第一个字段值相同就针对下一个字段值进行比较,依次...
  • 建立一个联合索引,能够命中的情况? 继承和多态的关系? Linux中的常用命令?如何查看一个进程对于资源的占用情况,用什么命令?文件的所属用户和所属用户组,文件权限?Linux中一共...
  • MySQL索引怎么加速查询的? 数据库索引 MySql主从复制,从原理到实践! MySQL查询缓存 MySQL 的 InnoDB 存储引擎是怎么设计的? 数据库基础知识 原来MySQL面试还会问这些(undo log) 分库分表方案 MySQL安全方案 ...

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

mysql怎么建立联合索引

mysql 订阅