mysql索引无法命中情况

1,查询占表数据30%以上

2,小表查询

3,规定不用索引查询

4,查询条件给字符串加引号用索引,否则不用

5,条件中用到or,除非涉及到的列都有索引否则不命中

6,like 的  %在前不命中,在后命中

示例 explain select * from adminlog

执行结果:
id select_type table partitjons type possible_keys key key_len ref row filtered Extra
1 SIMPLE adminlog   ALL         2 100  

select_type  :查询类型

simple简单查询   primary 主查询  UNION 第二个或者后面的查询语句。SUBQUERY : 子查询中的第一个select]

table :输出结果的表

type:查询级别

type=ALL 全表扫描,

type=index 索引全扫描,遍历整个索引来查询匹配的行
type=range 索引范围扫描,常见于 <,<=,>,>=,between,in等操作符。

例 
explain select * from adminlog where id>0 , 
explain select * from adminlog where id>0 and id<=100
explain select * from adminlog where id in (1,2) 
type=ref  使用非唯一索引或唯一索引的前缀扫描,返回匹配某个单独值的记录行。ref还经常出现在JOIN操作中
type=eq_ref 类似于ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中有一条记录匹配;简单来说,说是多表连接中使用 主建或唯一健作为关联条件
type=const/system 单表中最多有一个匹配行。主要用于比较primary key [主键索引]或者unique[唯一]索引,因为数据都是唯一的,所以性能最优。条件使用=。 

type=NULL 不用访问表或者索引,直接就能够得到结果

4、possible_keys : 可能使用的索引列表.

5、key : 实现执行使用索引列表
6、key_len : 索引的长度
7、ref : 显示使用哪个列或常数与key一起从表中选择行。
8、row : 执行查询的行数,简单且重要,数值越大越不好,说明没有用好索引

索引类型

1.普通索引
是最基本的索引,它没有任何限制。它有以下几种创建方式:
(1)直接创建索引

CREATE INDEX index_name ON table(column(length))

(2)修改表结构的方式添加索引

ALTER TABLE table_name ADD INDEX index_name ON (column(length))

(3)创建表的时候同时创建索引

CREATE TABLE `table` (`id` int(11) NOT NULL AUTO_INCREMENT ,`title` char(255) CHARACTER NOT NULL ,`content` text CHARACTER NULL ,`time` int(10) NULL DEFAULT NULL ,PRIMARY KEY (`id`),INDEX index_name (title(length))
)

(4)删除索引

DROP INDEX index_name ON table

2,

2.唯一索引
与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。它有以下几种创建方式:
(1)创建唯一索引

CREATE UNIQUE INDEX indexName ON table(column(length))

(2)修改表结构

ALTER TABLE table_name ADD UNIQUE indexName ON (column(length))

(3)创建表的时候直接指定

CREATE TABLE `table` (`id` int(11) NOT NULL AUTO_INCREMENT ,`title` char(255) CHARACTER NOT NULL ,`content` text CHARACTER NULL ,`time` int(10) NULL DEFAULT NULL ,UNIQUE indexName (title(length))
);

3.主键索引
是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引:

CREATE TABLE `table` (`id` int(11) NOT NULL AUTO_INCREMENT ,`title` char(255) NOT NULL ,PRIMARY KEY (`id`)
);

4.组合索引
指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合

ALTER TABLE `table` ADD INDEX name_city_age (name,city,age); 

5.全文索引
主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。fulltext索引配合match against操作使用,而不是一般的where语句加like。它可以在create table,alter table ,create index使用,不过目前只有char、varchar,text 列上可以创建全文索引。值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE index创建fulltext索引,要比先为一张表建立fulltext然后再将数据写入的速度快很多。
(1)创建表的适合添加全文索引

CREATE TABLE `table` (`id` int(11) NOT NULL AUTO_INCREMENT ,`title` char(255) CHARACTER NOT NULL ,`content` text CHARACTER NULL ,`time` int(10) NULL DEFAULT NULL ,PRIMARY KEY (`id`),FULLTEXT (content)
);

(2)修改表结构添加全文索引

ALTER TABLE article ADD FULLTEXT index_content(content)

(3)直接创建索引

CREATE FULLTEXT INDEX index_content ON article(content)

四、缺点

1.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行insert、update和delete。因为更新表时,不仅要保存数据,还要保存一下索引文件。同时考虑索引的命中,先建表插入数据在建索引比建好索引插入数据快
2.建立索引会占用磁盘空间的索引文件。一般情况这个问题不太严重,但如果你在一个大表上创建了多种组合索引,索引文件的会增长很快。
索引只是提高效率的一个因素,如果有大数据量的表,就需要花时间研究建立最优秀的索引,或优化查询语句。

五、注意事项

使用索引时,有以下一些技巧和注意事项:

1.字段的区分度非常低,完全无法区分会降低速度 ,因为值都相同 这样一来B+树会没有任何的子节点,像一根竹竿每一都匹配相当于,有几条记录就有几次io ,所有要注意 区分度低的字段不应该建立索引,不能加速查询反而降低写入效率,
2.索引不会包含有null值的列
只要列中包含有null值都将不会被包含在索引中,复合索引中只要有一列含有null值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为null。
3.使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个char(255)的列,如果在前10个或20个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
4.索引列排序
查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
5.like语句操作
一般情况下不推荐使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
6. .索引字段不能参加运算 select count(*) from usr where id * 12 = 120; #速度非常慢原因在于 mysql需要取出所有列的id 进行运算之后才能判断是否成立 #解决方案 select count(*) from usr where id = 120/12; #速度提升了 因为在读取数据时 条件就一定固定了 相当于 select count(*) from usr where id = 10;

7.and有索引 mysql并不是从左往右傻傻的去查 而是找出一个区分度高的字段优先匹配 #改为范围匹配 ,or从左往右

8,.多字段联合索引 为什么需要联合索引 案例: select count(*) from usr where name = "jack" and gender = "m" and id > 3 and email = "xxxx2@qq.com"; 假设所有字段都是区分度非常高的字段,那么除看id为谁添加索引都能够提升速度,但是如果sql语句中没有出现所以字段,那就无法加速查询,最简单的办法是为每个字段都加上索引,但是索引也是一种数据,会占用内存空间,并且降低写入效率 此处就可以使用联合索引, 联合索引最重要的是顺序 按照最左匹配原则 应该将区分度高的放在左边 区分度低的放到右边 #删除其他索引 drop index name_index on usr; drop index email_index on usr; #联合索引 create index mul_index on usr(email,name,gender,id); # 查询测试 select count(*) from usr where name = "xx" and id = 1 and email = "xx"; 只要语句中出现了最左侧的索引(email) 无论在前在后都能提升效率 drop index mul_index on usr; ``` 
物理角度上

1. 聚集索引(Clustered Index)

聚集索引决定数据在磁盘上的物理排序,一个表只能有一个聚集索引。

2. 非聚集索引(Non-clustered Index)

非聚集索引并不决定数据在磁盘上的物理排序,索引上只包含被建立索引的数据,以及一个行定位符 row-locator,这个行定位符,可以理解为一个聚集索引物理排序的指针,通过这个指针,可以找到行数据。

转载于:https://www.cnblogs.com/wrqysrt/p/10902335.html

mysql,索引命中,查询级别相关推荐

  1. Mysql索引命中级别

    Mysql索引命中级别 type结果值从好到坏依次是: system > const > eq_ref > ref > fulltext > ref_or_null &g ...

  2. mysql 索引命中规则 不命中的情况

    mysql 索引命中规则 不命中的情况 多列索引 遵循:最左匹配原则 不会命中索引的情况 案例分析 当一条sql语句提交给mysql数据库进行查询的时候需要经历以下几步 1.先在where解析这一步把 ...

  3. Mysql索引命中问题

    索引概念和作用 索引是一种使记录有序化的技术,它可以指定按某列/某几列预先排序,从而大大提高查询速度(类似于汉语词典中按照拼音或者笔画查找). 索引的主要作用是加快数据查找速度,提高数据库的性能. M ...

  4. mysql索引命中查看_MySQL索引无法命中的几种情况及索引验证方法

    几种常见的索引不命中情况如果条件中有 or ,即使其中有条件带索引也不会命中(这也是为什么尽量少用or的原因) like查询是以%开头,如果是int型索引不会命中,字符型的命中 'test%' 百分号 ...

  5. 新同事上来就优化了一遍MySQL索引和查询,老板人傻了。。。

    Java研发工程师必备技能非MySQL莫属,虽说易学好上手,但应对大厂面试,最容易遭遇滑铁卢.功败垂成的也是它. 上手简单,玩转难,才是这款开源数据库叱咤业界多年的真实写照. MySQL 8.0正式版 ...

  6. mysql索引对查询效率的影响

    文章目录 数据准备 创建一张表 创建随机生成姓名的函数 创建新增n条数据的存储过程 表里插入两千万条数据 没索引 有索引 数据准备 创建一张表 create table student (s_id v ...

  7. mysql 索引碎片查询_Sqlserver:索引碎片的查询

    索引 碎片 : 内部 碎片 (或说叶级填充率):反映数据叶级的空间占用率或空闲率 外部 碎片 :由于sqlserver以连续的8个page作为一个数据库块(区)extent作为读取单位,故此由于物理存 ...

  8. mysql索引(b+tree)小记

    索引:快速检索的数据结构,缺点是插入时要创建索引树,所以索引不能太多 1.hash O(1) 时间复杂度低 有冲突,不支持范围查询,不支持排序 2.二叉树BST 平衡树:O(logn) 缺点:当树不平 ...

  9. mysql索引级别快慢_面试小点-MySQL 的两种索引方法如何提高查询速度

    MySQL 索引的建立对于 MySQL 的高效运行是很重要的,索引可以大大提高 MySQL 的检索速度. 索引方法 Mysql 的索引方法有两种,BTERR 和 HASH. 散列表(Hash Tabl ...

最新文章

  1. .net core上 K8S(七).netcore程序的服务发现
  2. selector多路复用_多路复用器Selector
  3. Java-自定义注解
  4. python中os模块里有哪些类_python-os模块的常用方法
  5. 【PDF】PDF无法注释的一种解决方案
  6. 软件中的1、同步调用;2、回调;3、异步调用
  7. python如何互换_python中怎么交换列的顺序
  8. Nodejs版本的企业微信中接收消息与腾讯对接之接收消息 代码已经上传,可以去下载
  9. 玩家国度ROG 幻14 拆机 升级 换固态 换配件 教程
  10. 用Alt码打出Pi以及各式各样的符号
  11. mysql优化--避免数据类型的隐式转换
  12. 数据结构-单链表LNode,*LinkList
  13. 用python处理蛋白质互作信息
  14. python螺旋线-利用Python绘制一个正方形螺旋线
  15. HDU 5745 La Vie en rose(DP+bitset优化)
  16. 拔丝芋头的Java学习日记--Day4
  17. C++ VTK VMTK 提取血管中心线
  18. java.sql.SQLException: Incorrect Integer value:‘****‘ for column ‘id‘ at row 1 解决方案
  19. S32K144之时钟配置及时钟查看
  20. ping github.com 请求超时/丢包率为100% || Windows “您没有权限在此位置保存文件”(已解决)

热门文章

  1. 小程序登录本地服务器,微信小程序实现用户登录模块服务器搭建
  2. vue element table switch开关组件
  3. 图解TCPIP-NAT
  4. vue.js v-model
  5. 1.11 双向神经网络
  6. java kotlin相互调用_Kotlin的互操作——Kotlin与Java互相调用
  7. python 如何做密码对话框_Python GUI教程(八):在主窗口中调用对话框
  8. 会说话的狗狗本电脑版_「电脑知识」硬件狗狗专业电脑硬件检测跑分工具免安装单文件版|电脑硬件|电脑|显卡|狗狗|操作系统...
  9. 我换了一个灯泡,看看互联网大厂员工们的简历上都会怎么写
  10. 安装了pygame、但是在python无法导入_详解有关PyCharm安装库失败的问题的解决方法...