mysql 索引(二)

mysql索引优化实战一、二 MySQL索引优化实践总结:1.查询优化器会基于成本评估是否使用索引,范围查询可能导致全表扫描;2.强制索引可能因回表操作反而降低效率,覆盖索引可优化查询性能;3.索引使用与数据量相关,小表in/or查询可能不走索引;4.索引下推(5.6+)可减少回表次数,但范围查询不适用;5.排序优化遵循最左前缀原则,group by原理类似order by;6.join查询优先使用索引字段,小表驱动大表;7.count(*)≈count(1)效率最高;8.索引建立原则:联合索引覆盖高频查询,避免小基数字段索引,长字符用 阅读详情
表 索引 语句 索引 事务 主从

show process list—>临时表(group by order by )

表(常用 or 不常用  定长 or 变长  节约 tinyint 0-255岁)

索引:
+独立索引,只能使用一个 
+ 多列索引,><和like之后的and 
+ 场景索引:复合索引 (cate_id,price)
+覆盖索引(using index,走索引,不用回行查找)
+聚族 or  非聚族:既存储了主键值,又存储了行数据,这种结构称为”聚簇索引”
myisam 依赖行号  innodb 数据行放入主键,不连续会产生索引页的分裂
+理想索引:区分度 和 长度
select count(distinct left(word,6))/count(*) from dict;
+延迟关联:select a.* from it_area as a inner join (select id from it_area where name like '%东山%') as t on a.id=t.id 
+排序:覆盖索引取出来就是有序的 or  取出来后形成临时表再通过filesort排序 =>争取取出来就是有序的
比如: goods商品表, (cat_id,shop_price)组成联合索引,
where cat_id=N order by shop_price ,可以利用索引来排序,
select goods_id,cat_id,shop_price from goods order by shop_price;
// using where,按照shop_price索引取出的结果,本身就是有序的.
select goods_id,cat_id,shop_price from goods order by click_count;
// using filesort 用到了文件排序,即取出的结果再次排序
+重复索引, 去掉.
+冗余索引: x m xm mx
+索引碎片与维护 alter table xxx engine innodb   optimize table 表名 ,也可以修复.


sql语句:等待 + 执行(查 取)

优化:explain

--type列: 是指查询的方式, 非常重要,是分析”查数据过程”的重要依据
all:  意味着从表的第1行,往后,逐行做全表扫描.,运气不好扫描到最后一行.
index: 比all性能稍好一点,(2种情况可能出现:索引覆盖但是又必须全索引扫描 or 是利用索引来进行排序,但取出所有的节点)
range: 意思是查询时,能根据索引做范围的扫描
ref  意思是指 通过索引列,可以直接引用到某些数据行
eq_ref 是指,通过索引列,直接引用某1行数据,常见于连接查询中
const, system, null  这3个分别指查询优化到常量级别, 甚至不需要查找时间.

--extra:
using index: 是指用到了索引覆盖,效率非常高
using where 是指光靠索引定位不了,还得where判断一下 
using temporary 是指用上了临时表, group by 与order by 不同列时,或group by ,order by 别的表的列.
using filesort : 文件排序(文件可能在磁盘,也可能在内存), (
select sum(shop_price) from  goods group by cat_id(这句话,用到了临时表和文件排序)

--语法:
in(先外后内)==>join(先内后外)
from子查询(内层返回要尽量少,因为有了临时表)
count 别用where
min/max mysql内部已优化
group by 用于分组而不是筛选
union+all,不要去重

limit:limit offset,N,  取offset+N行,返回放弃前offset行,返回N行.
 
优化办法:
从业务上去解决:不允许翻过100页
or
不用offset,用条件查询.
mysql> select id,name from lx_com limit 5000000,10;
mysql> select id,name from lx_com where id>5000000 limit 10;

问题: 2次的结果不一致
原因: 数据被物理删除过,有空洞.
解决:一般来说,大网站的数据都是不物理删除的,只做逻辑删除 ,比如 is_delete=1
 
非要物理删除,还要用offset精确查询,还不限制用户分页,怎么办?
分析: 优化思路是 不查,少查,查索引,少取.  这种技巧就是延迟索引.
mysql> select id,name from lx_com inner join (select id from lx_com limit 5000000,10) as tmp using(id);


事务和隔离性:

原子性: 是指某几句sql的影响,要么都发生,要么都不发生.
一致性: 事务前后的数据,保持业务上的合理一致.
隔离性:其他事务,看不到此事务的任何效果.
持久性: 事务一旦发生,不能取消. 只能通过补偿性事务,来抵消效果.
 
read uncommitted: 读未提交的事务内容,显然不符原子性, 称为”脏读”.
read commited: 读不到另一个进行事务的操作,但是,可以读到另一个结束事务的操作影响.
repeatable read: 可重复读,即在一个事务过程中,所有信息都来自事务开始那一瞬间的信息,
serializeable 串行化 ,隔离的级别最高事务必须编号,事务相互等待的等待长

主从:
步骤:binlog relay-log  grant  changemaster  starslave

状态:
show master status ; 查看master的状态, 尤其是当前的日志及位置
show slave stattus; 查看slave的状态.
reset slave ;  重置slave状态.
start slave ; 启动slave 状态(开始监听msater的变化)
stop slave; 暂停slave状态;

多主:offset increment ==> redis incrby 

原则:最左前缀—>顺序 abc= a or ab or abc



匹配类型:全值 最左前缀 列前缀  范围值 精确匹配某一列并范围匹配另外一列 只访问索引的查询,同时,支持order by排序

如果不是按照索引最左列开始查找,无法使用索引

不能跳过索引中的列

某个列进行范围查询,右边的列无法使用索引

如果查询中只有索引包含的列,那么就可以使用索引直接在引擎读取数据行,引擎不用再返回数据行给mysql服务器了




--索引扫描排序

只有当索引的列顺序和order by子句顺完全一致,且所有列的排序方向一致时,才行。索引排序也需要满足最左排序。

如果多张表关联,那么只能用到第一张表的索引。

有一种例外情况,就是覆盖索引,如果有一个常量在where子句,那么可以和order by合并成覆盖索引。

--无法覆盖索引的情况有,不在索引中的列,无法组合成索引的最左前缀,排序方向不一致,有范围查询导致后面索引用不上







MySQL(二)MySQL索引原理 全表扫描:explain分析type属性all全索引扫描:explain分析type属性index索引过滤性不好:靠索引字段选型、数据量和状态、表设计频繁的回表查询开销:尽量少用select *,使用覆盖索引。 阅读详情

相关推荐

用Matlab和CVX搞定原子范数最小化:一个信号处理小白的避坑实践

本文详细介绍了如何使用Matlab和CVX实现原子范数最小化(Atomic norm minimization),特别适合信号处理初学者。从CVX安装配置、核心代码解析到实战中的典型问题与解决方案,提供了全面的避坑指南。通过具体案例展示了原子范数在频率估计和DOA估计中的优势,并给出性能优化策略和可视化方法。

weixin_28731231的博客 232

MySQL 索引(二)

正式因为有序,在查找的时候,从头到后都是有效查找,没有任何一个查找是浪费的,而且,如果运气好,是可以提前结束查找过程的。B树节点,既有数据,又有Page指针,而B+,只有叶子节点有数据,其他目录页,只有键值和Page指针。页内部存放数据的模块,实质上也是一个链表的结构,链表的特点也就是增删快,查询修改慢,所以优化查询。和页内目录不同的地方在于,这种目录管理的级别是页,而页内目录管理的级别是行。4. 最底层的叶子节点的目录页存的是用户的数据,中间的节点存的是目录页的地址。

的博客 2267

【博弈论基础与几大经典模型】古诺模型、斯塔克尔伯格模型Stackelberg Game、价格领导模型、Bertrand模型、Sweezy模型

博弈论中经典模型☞古诺模型、斯塔克尔伯格模型、价格领导模型等

学习记录 3万+

MySQL总结(二)——MySQL索引

MySQL索引简介 MySQL索引使用的数据结构主要有BTree索引 和 哈希索引。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。 BTree索引 MySQL的BTree索引使用的是B树中的B+Tree,但对于主要的两种存储引擎的实现方式是不同的。 MyISAM: B+Tree叶节点的d...

JSai的博客 4448

RK3588设备树节点实战:从零配置音频与显示模块(ES8388+DSI0)

本文详细介绍了在RK3588平台上配置音频编解码器ES8388和显示接口DSI0的设备树节点实战。通过具体案例拆解设备树节点的编写逻辑与调试技巧,包括音频路由与声卡配置、DSI控制器基础配置、视频通路路由配置以及电源管理与时钟树设计。文章还提供了调试工具与实战技巧,帮助开发者快速解决常见问题。

weixin_42525637的博客 351

【智能优化算法】2024年SCI鳗鱼-石斑鱼优化算法(EGO),含MathType公式、word伪代码、visio流程图、matlab代码等。

该文中包括5个内容:用MathType编辑的公式、伪代码、visio的流程图,matlab代码,PDF论文,拿来直接用,可以帮助科研者省下超多时间。 鳗鱼-石斑鱼优化算法(Eel and grouper optimizer ,EGO)是一种新型的元启发式算法(智能优化算法),灵感来源于海洋生态系统中鳗鱼和石斑鱼的共生作用和觅食策略。该成果由Ali Mohammadzadeh和Seyedali Mirjalili两位作者于2024年6月发表在SCI著名期刊《Cluster Computing》上。

2301_79359347的博客 1042

MySQL索引优化二

MySQL索引优化 最佳实践 联合索引 复合索引

小二说码的博客 306

Vivado DDR IP自定义型号避坑指南:如何正确填写CSV参数表(附常见错误排查)

本文详细解析了Vivado DDR IP自定义型号配置中的关键步骤与常见问题,特别针对DDR4内存颗粒的参数提取、CSV参数表填写误区及故障排查提供了实用指南。通过实际案例和调试技巧,帮助工程师避免配置陷阱,提升DDR4系统稳定性和性能。

weixin_29280657的博客 413

mysql 索引 二_MySQL之索引(二)

高性能的索引策略正确地创建和使用索引是实现高性能查询的基础。在MySQL之索引(一)这一章中我们介绍了各种类型的索引及其对应的优缺点。现在我们一起来看看如何真正地发挥这些索引的优势。独立的列我们通常会看到一些查询不当地使用索引,或者使得MySQL无法使用已有的索引。如果查询中的列不是独立的,则MySQL就不会使用索引。“独立的列”是指索引列不能是表达式的一部分,也不能是函数的参数。例如,下面这个查...

weixin_32183427的博客 156

基于Python+OpenCV中文及符号检测

一、项目背景与意义在图像处理、文档识别、自动翻译等场景中,中文及符号的准确检测是一个重要且复杂的任务。传统的字符检测方法往往对英文等拉丁字母系的识别效果较好,但对中文及特殊符号的识别准确率较低。本项目旨在利用Python编程语言结合OpenCV库,开发一个能够高效、准确地检测图像中中文及符号的系统,为相关领域的研究和应用提供技术支撑。二、技术实现图像预处理:利用OpenCV的图像处理功能,对输入的图像进行灰度化、二值化、滤波去噪等预处理操作,以提高中文及符号检测的准确性[1]。

2301_79809972的博客 1119

Cryptomatte For Nuke的安装

进入官网https://github.com/Psyop/Cryptomatte,下载文件代码。 将Cryptomatte/nuke里的文件内容复制粘贴到 .nuke文件夹内。 在我们复制粘贴的内容中可以看到两个文件。 同时,我们进入nuke的下载目录,打开plugins文件夹,看到和插件中一样python文件——init.py和menu.py。 我们将Cryptomatte里的init.py和menu.py里的python代码复制粘贴到Nuke/plugins下的init...

qq_41627587的博客 9061

MySQL索引(二)

MySQL有哪些索引、聚簇索引和非聚簇索引、回表和主键相关问题。外键、外键约束、联合索引、最左匹配原则、索引下推

好兄弟起把大狙 1130

告别倍福开发板:手把手教你用SSC工具为STM32生成EtherCAT从站代码

本文详细介绍了如何使用SSC工具为STM32生成EtherCAT从站代码,帮助开发者在不依赖倍福开发板的情况下实现高效的工业以太网通信。通过SSC工具的配置、XML文件设计、代码移植与硬件适配等步骤,开发者可以轻松构建自定义的EtherCAT通信系统,提升工业自动化项目的灵活性和效率。

weixin_33925615的博客 410

mysql索引优化(二)

单表优化: CREATE TABLE IF NOT EXISTS `article` ( `id` INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, `author_id` INT(10) UNSIGNED NOT NULL, `category_id` INT(10) UNSIGNED NOT NULL, `views` I...

十年一梦的博客 234

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

mysql 索引 二_MySql索引(二)

所有MySQL列类型可以被索引。根据存储引擎定义每个表的最大索引数和最大索引长度。所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节。大多数存储引擎有更高的限制。索引的存储类型目前只有两种(btree和hash),具体和存储引擎模式相关:MyISAM btreeInnoDB btreeMEMORY/Heap hash,btree默认情况MEMORY/H...

weixin_31642161的博客 88

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

5、MySQL索引优化实战二

在决定哪个表做驱动表的时候,应该是两个表按照各自的条件过滤。

srrsheng的博客 675

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

mysql 索引 二_2、MySQL索引

一、索引介绍索引是一种数据结构,用于帮助我们在大量数据中快速定位到我们想要查找的数据。索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。二、为啥要使用索引如上图,是MySQL中一张表T的2列数据,现在要找...

weixin_34275305的博客 91

【MySQL】索引(二)

一、创建索引1、创建原则2、语法3、示例(1)主键(2)普通索引二、全文索引1、介绍2、创建方式3、使用方式4、示例三、Explain1、功能与作用2、输出信息四、查询索引1、介绍2、语法3、输出内容4、示例五、删除索引1、语法2、注意3、示例

Snow_Dragon_L的博客 918

MySQL之索引学习——索引(二)

本篇主要总结一下MySQL索引中的一些优化手段。

技术知识分享 615

Mysql索引(二)

正因如此,红黑树的查询效率稍有下降,因为红黑树的平衡性相对较弱,可能会导致树的高度较高,这可能会导致一些数据需要进行多次磁盘IO操作才能查询到,这也是MySQL没有选择红黑树的主要原因。如果数据都存储在内存中,采用AVL树来存储,还是可以的,查询效率非常高。不过我们的数据是存在磁盘中,采用这种结构,每个节点对应一个磁盘块,数据量大的时候,也会和二叉树一样,会导致树的高度变高,这样逻辑上很近的节点实际可能非常远,无法很好的利用磁盘预读(局部性原理),会增加IO次数,所以用这种结构存储数据也是不可取的。

javaJasonjava的博客 981

MySQL ② —— 索引原理

详细介绍了MySQL的索引原理和innoDB的体系结构

qq_51148151的博客 881

MySQL索引二

序言 在上一篇文章中主要讲了索引的底层实现。主要讨论了为什么加了索引以后,数据库的查询效率会加快?底层怎么实现的?这个问题。 那么本文主要想讨论下以下几个问题 怎么建立合适索引,建立索引有哪些需要规避的要点? 为什么有时候建立了索引也没啥子用? 以下是自己最近学习和使用的一些想法,希望大家可以互相交流,反正是技术交流哈哈。 首先抛出两个语句干货。大家可以先去自己的数据库执行检查下。 – 查询冗...

betterFighter的博客 164

二、MySQL中的索引

学习笔记

ALLWE的博客 988

MySQL索引(二)

MySQL中的页目录(Page Directory)是InnoDB存储引擎中B+树数据结构的一部分,主要用于提高数据页(data page)内的查找效率。每个数据页存储记录时,页目录作为索引,帮助快速定位记录的位置。页目录的存在,使得在大数据页中查找特定记录的速度大大提升。

yyl0327的博客 1769

MySQL梳理二:索引

深度解析MySQL索引的核心原理与实现机制。从有无索引的查找效率对比出发,详细阐述B+树的多级目录结构、存储容量计算和快速定位原理,深入解读InnoDB聚簇索引的组织方式、工作机制和唯一性保证策略。同时探讨索引在ORDER BY排序、GROUP BY分组、回表查询等场景中的优化作用,为MySQL性能调优和索引设计提供理论基础与实践指导

Bai168779的博客 1158
上一篇: redis (一)
下一篇: redis (二)
telnet166
博客等级 码龄14年 14粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值