mysql,索引命中,查询级别
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=NULL 不用访问表或者索引,直接就能够得到结果
4、possible_keys : 可能使用的索引列表.
索引类型
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从左往右
1. 聚集索引(Clustered Index)
聚集索引决定数据在磁盘上的物理排序,一个表只能有一个聚集索引。
2. 非聚集索引(Non-clustered Index)
非聚集索引并不决定数据在磁盘上的物理排序,索引上只包含被建立索引的数据,以及一个行定位符 row-locator,这个行定位符,可以理解为一个聚集索引物理排序的指针,通过这个指针,可以找到行数据。
转载于:https://www.cnblogs.com/wrqysrt/p/10902335.html
mysql,索引命中,查询级别相关推荐
- Mysql索引命中级别
Mysql索引命中级别 type结果值从好到坏依次是: system > const > eq_ref > ref > fulltext > ref_or_null &g ...
- mysql 索引命中规则 不命中的情况
mysql 索引命中规则 不命中的情况 多列索引 遵循:最左匹配原则 不会命中索引的情况 案例分析 当一条sql语句提交给mysql数据库进行查询的时候需要经历以下几步 1.先在where解析这一步把 ...
- Mysql索引命中问题
索引概念和作用 索引是一种使记录有序化的技术,它可以指定按某列/某几列预先排序,从而大大提高查询速度(类似于汉语词典中按照拼音或者笔画查找). 索引的主要作用是加快数据查找速度,提高数据库的性能. M ...
- mysql索引命中查看_MySQL索引无法命中的几种情况及索引验证方法
几种常见的索引不命中情况如果条件中有 or ,即使其中有条件带索引也不会命中(这也是为什么尽量少用or的原因) like查询是以%开头,如果是int型索引不会命中,字符型的命中 'test%' 百分号 ...
- 新同事上来就优化了一遍MySQL索引和查询,老板人傻了。。。
Java研发工程师必备技能非MySQL莫属,虽说易学好上手,但应对大厂面试,最容易遭遇滑铁卢.功败垂成的也是它. 上手简单,玩转难,才是这款开源数据库叱咤业界多年的真实写照. MySQL 8.0正式版 ...
- mysql索引对查询效率的影响
文章目录 数据准备 创建一张表 创建随机生成姓名的函数 创建新增n条数据的存储过程 表里插入两千万条数据 没索引 有索引 数据准备 创建一张表 create table student (s_id v ...
- mysql 索引碎片查询_Sqlserver:索引碎片的查询
索引 碎片 : 内部 碎片 (或说叶级填充率):反映数据叶级的空间占用率或空闲率 外部 碎片 :由于sqlserver以连续的8个page作为一个数据库块(区)extent作为读取单位,故此由于物理存 ...
- mysql索引(b+tree)小记
索引:快速检索的数据结构,缺点是插入时要创建索引树,所以索引不能太多 1.hash O(1) 时间复杂度低 有冲突,不支持范围查询,不支持排序 2.二叉树BST 平衡树:O(logn) 缺点:当树不平 ...
- mysql索引级别快慢_面试小点-MySQL 的两种索引方法如何提高查询速度
MySQL 索引的建立对于 MySQL 的高效运行是很重要的,索引可以大大提高 MySQL 的检索速度. 索引方法 Mysql 的索引方法有两种,BTERR 和 HASH. 散列表(Hash Tabl ...
最新文章
- .net core上 K8S(七).netcore程序的服务发现
- selector多路复用_多路复用器Selector
- Java-自定义注解
- python中os模块里有哪些类_python-os模块的常用方法
- 【PDF】PDF无法注释的一种解决方案
- 软件中的1、同步调用;2、回调;3、异步调用
- python如何互换_python中怎么交换列的顺序
- Nodejs版本的企业微信中接收消息与腾讯对接之接收消息 代码已经上传,可以去下载
- 玩家国度ROG 幻14 拆机 升级 换固态 换配件 教程
- 用Alt码打出Pi以及各式各样的符号
- mysql优化--避免数据类型的隐式转换
- 数据结构-单链表LNode,*LinkList
- 用python处理蛋白质互作信息
- python螺旋线-利用Python绘制一个正方形螺旋线
- HDU 5745 La Vie en rose(DP+bitset优化)
- 拔丝芋头的Java学习日记--Day4
- C++ VTK VMTK 提取血管中心线
- java.sql.SQLException: Incorrect Integer value:‘****‘ for column ‘id‘ at row 1 解决方案
- S32K144之时钟配置及时钟查看
- ping github.com 请求超时/丢包率为100% || Windows “您没有权限在此位置保存文件”(已解决)
热门文章
- 小程序登录本地服务器,微信小程序实现用户登录模块服务器搭建
- vue element table switch开关组件
- 图解TCPIP-NAT
- vue.js v-model
- 1.11 双向神经网络
- java kotlin相互调用_Kotlin的互操作——Kotlin与Java互相调用
- python 如何做密码对话框_Python GUI教程(八):在主窗口中调用对话框
- 会说话的狗狗本电脑版_「电脑知识」硬件狗狗专业电脑硬件检测跑分工具免安装单文件版|电脑硬件|电脑|显卡|狗狗|操作系统...
- 我换了一个灯泡,看看互联网大厂员工们的简历上都会怎么写
- 安装了pygame、但是在python无法导入_详解有关PyCharm安装库失败的问题的解决方法...