mysql的索引使用选择

使用trace工具分析Mysql如何选择索引 MySQL的Trace工具是自MySQL 5.6版本引入的一个强大功能,用于SQL查询执行过程的深度追踪。通过启用trace,DBA和开发者可以深入了解MySQL服务器在执行特定SQL语句时内部优化器的行为以及各种操作的具体细节。 阅读详情

建立索引

  • 表的主键、外键必须有索引;
  • 数据量超过300的表应该有索引;
  • 经常与其他表进行连接的表,在连接字段上应该建立索引;
  • 经常出现在Where子句中的字段,特别是大表的字段,应该建立索引;
  • 索引应该建在选择性高的字段上;
  • 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
  • 频繁进行数据操作的表,不要建立太多的索引;

索引失效

  • 字符串不加单引号
  • 将要使用的索引列不是复合索引列表中的第一部分,则不会使用索引
  • 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null
  • 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0
  • 应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。
  • 应尽量避免在 where 子句中使用 or 来连接条件 (用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到),否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num=10 or num=20
  • 可以这样查询: select id from t where num=10 union all select id from t where num=20
  • in 和 not in 也要慎用,因为IN会使系统无法使用索引,而只能直接搜索表中的数据。如: select id from t where num in(1,2,3)
  • 对于连续的数值,能用 between 就不要用 in 了: select id from t where num between 1 and 3
  • 尽量避免在索引过的字符数据中,使用非打头字母%搜索。这也使得引擎无法利用索引。 见如下例子: SELECT * FROM T1 WHERE NAME LIKE ‘%L%’ SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=’L’ SELECT * FROM T1 WHERE NAME LIKE ‘L%’
  • 即使NAME字段建有索引,前两个查询依然无法利用索引完成加快操作,引擎不得不对全表所有数据逐条操作来完成任务。而第三个查询能够使用索引来加快操作
  • 应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描
  • 应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描
  • 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引

实例

我一个表 students 表,有3个字段 ,id,name,age 我要查询 通过 name 和age,在这两个字段 是创建 联合索引?还是分别在name和age上创建 单列索引呢? 多个字段查询什么情况下用联合索引 什么时候分别创建单列索引呢?

 

1,首先要确定优化的目标,在什么样的业务场景下,表的大小等等。如果表比较小的话,可能都不需要加索引。
2,哪些字段可以建索引,一般都where、order by 或者 group by 后面的字段。
3,记录修改的时候需要维护索引,所以会有开销,要衡量建了索引之后的得与失。

学生表,可以认为name的重复度比较小,而age的重复度比较大,对于单列索引来说,比较适合建在重读度低的列上。

对于select * from students where name='张三’and age=18; 题主所说的两种情况
A. name 和 age 各自单独建立索引。
一般来说mysql会选择其中一个索引,name的可能性比较大,因为mysq会统计每个索引上的重复度,选用低重复度的字段。另外一个age的索引就不会用到,但还有维护索引的开销,所以age的索引不需要创建。

B. name和age的联合索引
这种索引的切合度最好,mysql会直接选用这个索引。但相对单独的name索引来说,维护的成本要大一些,并且索引数据占用的存储空间也要更大一些。

回过来看,有必要使用联合索引吗? 我的看法是没有必要,因为学校里可能会有重名的人,但比较少。用name就可以比较精准的找到记录,即使有重复的也比较少。

什么情况下使用联合索引比较好呢? 举一个例子,大学选认课老师,需要创建一个关系对应表,有2个字段,student_id 和 teacher_id,想要查询某个老师和某个学生是否存在师生关系。
一个学生会选几十个老师,一个老师会带几百个学生
如果只为student_id建立索引的情况下,经过索引会选出几十条记录,然后在内存中where一下,去除其余的老师。
相反如果只为teacher_id建立索引,经过索引会选出几百条记录,然后在内存中where一下,去除其余的学生。
两种情况都不是最优的,这个时候使用联合索引最合适,通过索引直接找到对应记录。

 

创建索引实例:

首先创建一个表:create table students (id int primary key,name varchar(20),age Int);

创建单个索引的语法:create index 索引名 on 表名(字段名)

索引名一般是:表名_字段名

给id创建索引:create index students _id on students (id);

创建联合索引的语法:create index 索引名 on 表名(字段名1,字段名2) 
 

给name和age创建联合索引:create index students _name_age on students (name,age)

 

 

MySQL_MySQL 联合索引详解 以及注意事项

联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 .当最左侧字段是常量引用时,索引就十分有效。


两个或更多个列上的索引被称作复合索引。
利用索引中的附加列,您可以缩小搜索的范围,但使用一个具有两列的索引 不同于使用两个单独的索引。复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。如果您知 道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不姓,电话簿将没有用处。
所以说创建复合索引时,应该仔细考虑列的顺序。对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用;仅对后面的任意列执行搜索时,复合索引则没有用处。
如:建立 姓名、年龄、性别的复合索引。
 

create table test(
a int,
b int,
c int,
KEY a(a,b,c)
);

优: select * from test where a=10 and b>50
差: select * from test where a50

优: select * from test order by a
差: select * from test order by b
差: select * from test order by c

优: select * from test where a=10 order by a
优: select * from test where a=10 order by b
差: select * from test where a=10 order by c

优: select * from test where a>10 order by a
差: select * from test where a>10 order by b
差: select * from test where a>10 order by c

优: select * from test where a=10 and b=10 order by a
优: select * from test where a=10 and b=10 order by b
优: select * from test where a=10 and b=10 order by c

优: select * from test where a=10 and b=10 order by a
优: select * from test where a=10 and b>10 order by b
差: select * from test where a=10 and b>10 order by c


 

mysql 复合索引,联合索引 - flyflying1987 - ly

 

为什么SQL执行计划未使用创建的索引呢?MySQL是如何选择索引的? MySQL 会根据成本计算得到最优的执行计划, 根据不同条件选择最优执行计划,而不是同一类型一成不变的执行过程,这才是优秀的优化器该有的样子。在关系型数据库中,B+ 树索引只是存储的一种数据结构,具体怎么使用,还要依赖数据库的优化器,优化器决定了具体某一索引的选择,也就是常说的执行计划。这些操作都在 Server 层完成。但是对于性别这样的字段,其值只有男和女两种,哪怕记录数再多,也只有两种值,这是低选择性的字段,因此无须在性别字段上创建索引。 阅读详情

相关推荐

Mysql优化选择最佳索引使用方法

索引的目的在于提高查询效率,其功能可类比字典,通过该索引可以查询到我们想要查询的信息,因此,选择建立好的索引十分重要,以下是为Mysql优化选择最佳索引的方法步骤: 1. 首先列出查询中所有使用的表,并为查询中的每个子查询创建一个独立的列表。如果有一个包含 2 个 SELECT 子查询的 SELECT 查询,应该建立 3 个列表,每个列表包含引用在其中的表。在此过程结束时,就会在每个查询列表中为...

lmseo5hy的博客 286

索引的使用

使用索引 建表sql CREATE TABLE staffs ( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR (24) NULL DEFAULT '' COMMENT '姓名', age INT NOT NULL DEFAULT 0 COMMENT '年龄', pos VARCHAR (20) NOT NULL DEFAULT '' COMMENT '职位', add_time TIMESTAMP NOT NULL DEFAU

岁月的博客 682

地图坐标系大全:常用地图坐标系详解与转换指南

地图坐标系是用于描述地图上位置的数学模型。它可以用来表示地球表面上的任意一个点,使得这个点的位置可以在地图上精确定位。不同的地图坐标系采用不同的基准面和投影方式,因此会有不同的坐标系参数,不同的坐标系之间也需要进行坐标转换。在地图制图、导航、GIS等领域中,地图坐标系是一个非常重要的概念。

weixin_39888010的博客 1万+

数据库索引失效的情况

1、列与列之间的对比 比如一张表中的两列(id和c_id)都单独建立了索引,但是下面这种情况不会走索引 select * from table where id = c_id; //这种情况会被认为还不如走全表扫描 2、存在NULL值 我们在设计数据库时尽量避免NULL值的出现,如果不可避免地要出现NULL值的情况,也要这是默认值,比如数值类型的可以设置为0或者-1,字符串可以设成空字符串或者其他的东西。 如果索引列是可空的,是不会给其创建索引的,索引值是小

北城寒冰 938

拯救者R7000用户实测:用华为电脑管家11.0版搞定MatePad Pro多屏协同(附驱动与显卡避坑指南)

本文详细介绍了如何在非华为笔记本联想拯救者R7000上安装华为电脑管家11.0版,实现与MatePad Pro的多屏协同功能。从驱动优化到显卡配置,提供了全面的避坑指南和实用技巧,帮助用户解决连接失败等常见问题,提升跨设备生产力体验。

weixin_30788619的博客 398

YOLOv10注意力革新:小波域注意力(WDA)如何实现多尺度特征精准聚焦

本文深入解析YOLOv10中的小波域注意力(WDA)机制,探讨其如何通过频域分解与动态聚焦实现多尺度特征精准提取。WDA模块结合离散小波变换与注意力机制,显著提升小目标检测性能,在VisDrone数据集上AP提升达12.6%。文章详细介绍了两种集成方案及代码实现,为计算机视觉开发者提供实用指南。

weixin_29079671的博客 253

MySQL-索引优化(五)

MySQL在使用不等于(!=或<>)的时候无法使用索引,会导致全表扫描 先看等于的情况再看不等于的情况 mysql> EXPLAIN SELECT * from staffs WHERE name='july'; +----+-------------+--------+------------+------+-----------------------+--------...

u010277958的博客 245

【自动驾驶控制算法】 第一讲 绪论

声明【自动驾驶控制算法】系列是博主对所分享教学内容的学习笔记,并且该系列每篇博客都会将博主听课后总结的纸质版笔记附于文末,供大家参考。是一位研究汽车领域,无人驾驶方向及其相关方向的大佬,也算是博主在无人驾驶方向的启蒙老师。所以研究相关领域的朋友推荐去听一听他的视频讲解。...

iamtbon_1的博客 1797

MySQL的索引详细介绍(全网最详细!!!)

MySQL的索引详细介绍(全网最详细!!!)

qq_55846232的博客 1万+

10|Git Diff 与增量代码识别:本次到底改了哪些代码?

本文介绍 Git Diff 和增量代码识别,帮助你理解精准测试如何先找到本次真正变化的代码。测试开发工程师。Java 后端开发工程师。质量平台 / DevOps 平台建设者。想了解精准测试落地方法的技术负责人。

专注 AI 精准测试平台实战落地,分享从代码 Diff 到回归决策的完整工程闭环。主张“先建数据链路,再上 AI 智能”,让测试从“靠经验”走向“基于风险”。 160

蓝牙调试抓包工具--nRF Connect移动端 使用详细总结

摘要: nRF Connect移动端是一款功能全面的蓝牙低功耗(BLE)调试工具,支持设备扫描、多设备连接、服务/特征值查看及数据读写操作。核心功能包括实时数据通信(读取/写入/通知)、设备固件更新(DFU)以及高级工具如自动化测试和信号分析。兼容Android 4.3+和iOS设备,适用于开发调试(如ESP32/nRF52)、设备管理和数据分析。需注意设备兼容性问题(如旧安卓设备可能需关闭连续扫描),并确保数据类型匹配。配套工具链包括nRF Toolbox和nRF Connect SDK,是BLE开发的必

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 2387

MySQL索引详解----看这一篇就够了

索引是数据库中用于加速数据检索的一种数据结构。它类似于书籍的目录,通过索引可以快速定位到数据的位置,而不需要扫描整个表。最左匹配原则是指在联合索引中,查询条件必须从索引的最左端开始,按照索引列的顺序依次匹配。如果查询条件没有从最左端开始,或者中间有列未匹配,索引将无法完全生效或部分失效。索引是MySQL中优化查询性能的重要工具。通过理解索引的结构、分类、使用方法和设计原则,可以显著提升数据库的查询效率。在实际应用中,需要根据具体的查询需求和数据特点,合理设计和使用索引。

秃头之旅 7065

机器人控制基础:伺服驱动器的泄放电阻

摘要:伺服驱动器泄放电阻用于消耗电机减速或制动时产生的再生电能,防止母线电压过高损坏元件。其核心作用是将多余电能转化为热能,规避硬件损坏和停机风险。选型需关注功率、阻值和封装三大参数,功率应匹配再生能量,阻值需符合驱动器要求,封装应满足散热需求。可通过动态监测母线电压或静态检测电阻阻值来判断其是否正常工作。

start_up_go的博客 384

MySql 索引选择与使用

提起优化SQL,你可能会把它理解为优化索引。简单来说这也不算错,索引在SQL优化中占了很大的比重。索引用得好,可以将SQL查询的效率提升10倍甚至更多。但索引是万能的吗?既然索引可以提升效率,只要创建索引不就好了吗?实际上,在有些情况下,创建索引反而会降低效率。

alexdyysp的博客 742

微信小程序 - 最新详细实现气泡菜单功能,点击任意元素在底部或附近周围弹出气泡菜单列表,仿微信气泡弹框显示菜单快捷功能收纳,自定义气泡弹窗/菜单气泡弹窗,小程序气泡框嵌套菜单组件插件,自动计算弹出定位

微信小程序,vue2,vue3,气泡列表,汽泡菜单,气泡框,泡泡框,悬浮框,悬浮菜单,点击菜单按钮弹出气泡,对话箭头气泡框,弹出的气泡准确定位并吸附在附近,弹出式气泡,弹窗菜单,气泡自定义HTML弹窗,带三角的气泡弹框,三角气泡框里面嵌套菜单,当点击一个按钮或元素时,会从附近弹出一个小气泡一样的菜单列表,自定义气泡框内的内容,点击一个元素在附近弹出一个气泡弹框功能效果,气泡弹框不准怎么办,被盖住了,挡住了,长按弹出,组件插件,微信,自定义气泡菜单组件,气泡弹出框,小程序自定义气泡框,菜单气泡,包裹列表的三角

🏆 前端领域优质创作者 3921

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

MySQL是如何选择使用哪个索引的,它会选错索引吗?

MySQL中索引的基数是通过采样统计得来的,采样统计的时候,InnoDB默认会选择N个数据页,统计这些页面上的不同值,得到一个平均值,然后再乘以这个索引的页面数,就得到了这个索引的基数。而数据表是会持续更新的,索引统计信息也不会固定不变,所以,当变更的数据行数超过1/M的时候,会自动触发重新做一次索引统计。这个统计信息就是索引的“区分度”,一个索引上不同的值的个数,称之后“基数”(cardinality),基数越大,索引的区分度越好。按顺序执行上述语句就会发现,MySQL用错了索引,导致了更长的执行时间。

zzm628的专栏 962

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

mysql索引的选择_10 MySQL索引选择与使用

索引概述每种存储引擎对每个表至少支持16个索引,总索引长度至少256字节.MyISAM和InnoDB的表默认创建BTREE索引.MEMORY引擎默认使用HASH索引,但也支持BTREEMySQL目前不支持函数索引,但支持前缀索引.MyISAM支持的前缀索引最大长度为1000字节;InnoDB支持的前缀索引最大程度是767字节.CREATE TABLE 创建索引时是按照字符数计量的,所以对于多字节的...

weixin_29798379的博客 117

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

深入解析MySQL索引:本质、分类、选择及使用原则

索引作为数据库中的一种核心数据结构,对于提高数据查询效率具有至关重要的作用。通过深入理解索引的本质、分类、选择及使用原则,我们可以更好地设计和优化数据库索引,从而提高数据库的性能和响应速度。在选择索引数据结构时,B+树凭借其高效的性能、稳定的数据结构和广泛的适用性成为了首选。同时,不同的存储引擎在索引支持、事务处理等方面各具特点,我们需要根据业务需求和数据特性进行权衡和选择。在使用索引时,我们应遵循一定的原则和方法来确保索引的有效性和高效性。

喜欢猪猪 910

mysql索引的使用顺序,什么情况下不使用索引,and连接多个索引时索引的使用选择

准备工作 mysql数据库版本5.7.28 建表语句 CREATE TABLE `test_key` ( `id` int(9) NOT NULL AUTO_INCREMENT, `key_1` int(9) NOT NULL, `key_2` int(9) NOT NULL, `key_3` int(9) DEFAULT NULL, `key_4` int(9) DEFAULT NULL, `name_1` varchar(255) DEFAULT NULL, `na...

zhai_shuai的博客 1878

【从删库到跑路】MySQL数据库的索引(二)——索引的使用和选择

详细讲解MySQL数据库索引的使用和选择问题

小吉妙妙屋 1305

mysql优化器选择不使用索引的情况

在使用索引的时,有时通过explain命令进行sql语句分析,会发现优化器没有选择索引去查找数据,而是通过扫描聚集索引(全表扫描)的方式。这种情况多发生于范围查找、JOIN链接等情况。 例如表tb_order: 使用Show index 查看索引:有orderId聚集索引和order_code 辅助索引; 用explain命令,查看索引的使用情况,发现是使用了辅助索引 explain selec...

wxq1075110242的博客 1084

MySQL的索引选择到底是干什么的?使用场景是什么?底层原理是什么?

索引选择就像是在玩具店里为每个类型的玩具准备了一个详细的目录。假设你的玩具店有很多不同种类的玩具,每次有小朋友来找特定的玩具时,如果直接从一堆玩具里找会很慢。但如果你有一个详细的目录(如按名字排序、按类型分类等),你可以迅速找到他们想要的玩具。在 MySQL 中,索引选择是指数据库根据查询条件自动选择最合适的索引来加速查询过程。MySQL 的索引选择就像是在玩具店里为每个类型的玩具准备了一个详细的目录,帮助迅速找到所需的信息。

长风破浪会有时的博客 424

手把手教你如何选择并使用MySQL索引,大幅提升查询性能

正确地选择和使用索引是MySQL数据库性能优化的核心技能。记住,索引是手段而非目的。你需要从实际的查询需求出发,理解数据分布和访问模式,通过EXPLAIN工具持续分析和调整。一个好的索引策略能让你的应用在数据增长时依然保持敏捷响应,为用户带来流畅的体验。现在,就检查一下你的数据库,看看哪些查询还在进行全表扫描,为它们加上合适的“引擎”吧!

u010138425的博客 340

mysql使用多个索引_MySQL多索引查询选择

MySQL多索引查询选择MySQL选择索引-引入我们知道我们一个表里面可以有多个索引的,那么我们查询数据的时候不指定索引,MySQL就会帮我们自动选择。既然是MySQL程序帮我们自动选择的那么会不会有问题的呢?答案是会的,MySQL的优化器也有bug,有时候选择的索引并不是最优的。案例1假如一张表有10w的数据,有id主键和a,b普通索引,执行以下SQLselect * from t where ...

weixin_28683165的博客 4907

mysql性能优化系列(四) ---如何选择合适的列建立索引以及使用索引的注意事项

一、如何选择合适的列建立索引 1、在where从句,group by从句,order by从句,on从句中的列添加索引 2、索引字段越小越好(因为数据库数据存储单位是以“页”为单位的,数据存储的越多,IO也会越大) 3、离散度大的列放到联合索引的前面(离散度:字段中不同的记录的数量,数量越多,则表明离散程度越大) 什么是联合索引 1、 两个或更多个列上的索引被称作联合索引,又被称为是复合索引。 2...

逆流而上的博客 8054

mysql limit 没用索引_mysql的limit影响sql使用的索引的选择 ?

前些天,测试人员向我反映有一家企业的通讯录同步接口不返回数据,我查日志 nginx的相应access.log状态码是499,请求超时,从网上查找资料分析有两种可能:1.客户端主动断开连接2.服务端响应超时造成客户端连接中断问了客户端的开发人员,他们说他们设置响应超时时间为5秒,5s未返回则超时再查服务器日志发现整个接口耗时快6s多了 但是这个接口里面调了两个别的服务的接口,具体还真不知道哪个接口耗...

weixin_29826879的博客 1022
上一篇: quartz定时器的Cron表达式
下一篇: MySQL优化概述(索引优化,sql优化,表优化)
tom和cat
博客等级 码龄11年 100粉丝 113原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值