Mysql 查询优化及索引优化总结
本文为博主原创,转载请注明出处:
一。Mysql 索引的优缺点:
优点:加快数据的检索速度,这是应用索引的主要用途; 使用唯一索引可以保证数据的唯一性
缺点: 索引也需要占用物理空间,并不是索引越多越好,若索引过多,也会导致数据检索效率降低
二。Mysql 索引设计原则:
1.联合索引尽量覆盖条件
让每一个联合索引都尽量去包含sql语句里的where、order by、group by的字段,还要确保这些联合索引的字段顺序尽量满足sql查询的最左前缀原则。
2. where与order by冲突时优先where
一般这种时候往往都是让where条件去使用索引来快速筛选出来一部分指定的数据,接着再进行排序。因为大多数情况基于索引进行where筛选往往可以最快速度筛选出你要的少部分数据,然后做排序的成本可能会小很多。
3. 限制索引的数目
索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间。
4. 选择区分度高的列作为索引
尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,且mysql 使用B+树,当索引值之间的区分度越大,则越能发挥B+ 树的优势,若区分度小,则发挥不出索引的优势
5. in 和 or 查询索引使用规则
in和or在表数据量比较大的情况会走索引,在表记录不多的情况下会选择全表扫描
6. like KK% 一般情况都会走索引
like 模糊查询中,右模糊查询(abc%)会使用索引,而(%abc)和(%abc%)会放弃索引而使用全表扫描
7. where 与 order by 的索引优化
MySQL支持两种方式的排序filesort和index,Using index是指MySQL扫描索引本身完成排序。index效率高,filesort效率低。如果order by的条件不在索引列上,就会产生Using filesort;
order by满足两种情况会使用Using index:1.order by语句使用索引最左前列。2.使用where子句与order by子句条件列组合满足索引最左前列。
8. in 与 exist 优化
原则:小表驱动大表,即小的数据集驱动大的数据集
in:当B表的数据集小于A表的数据集时,in优于exists
select * from A where id in (select id from B)
exists:当A表的数据集小于B表的数据集时,exists优于in
select * from A where exists (select 1 from B where B.id = A.id)
EXISTS (subquery)只返回TRUE或FALSE
9. count(*) 查询优化
字段有索引:count(*)≈count(1)>count(字段)>count(主键 id) //字段有索引,count(字段)统计走二级索引,二级索引存储数据比主键索引少,所以count(字段)>count(主键 id)
字段无索引:count(*)≈count(1)>count(主键 id)>count(字段) //字段没有索引count(字段)统计走不了索引,
count(主键 id)还可以走主键索引,所以count(主键 id)>count(字段)
count(1)跟count(字段)执行过程类似,不过count(1)不需要取出字段统计,就用常量1做统计,count(字段)还需要取出字段,所以理论上count(1)比count(字段)会快一点。
count(*) 是例外,mysql并不会把全部字段取出来,而是专门做了优化,不取值,按行累加,效率很高,所以不需要用count(列名)或count(常量)来替代 count(*)。
为什么对于count(id),mysql最终选择辅助索引而不是主键聚集索引?因为二级索引相对主键索引存储数据更少,检索性能应该更高,mysql内部做了点优化(应该是在5.7版本才优化)。
Mysql 查询优化及索引优化总结的更多相关文章
- MySQL中的索引优化
MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 过多的使用索引将会造成滥用.因此索引也会有它的缺点.虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行 ...
- MySql在建立索引优化时需要注意的问题
MySql在建立索引优化时需要注意的问题 设计好MySql的索引可以让你的数据库飞起来,大大的提高数据库效率.设计MySql索引的时候有一下几点注意: 1,创建索引 对于查询占主要的应用来说,索引显得 ...
- MySQL慢查询优化、索引优化、以及表等优化总结
MySQL优化概述 MySQL数据库常见的两个瓶颈是:CPU和I/O的瓶颈. CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候. 磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应 ...
- 阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结
更多内容:https://www.toutiao.com/i6599796228886626829/?tt_from=weixin&utm_campaign=client_share& ...
- MySQL系列(六)--索引优化
在进行数据库查询的时候,索引是非常重要的,当然前提是达到一定的数据量.索引就像字典一样,通过偏旁部首来快速定位,而不是一页页 的慢慢找. 索引依赖存储引擎层实现,所以支持的索引类型和存储引擎相关,同一 ...
- mysql 高级和 索引优化,目的:查的好,查的快,性能好
1-事物隔离级别: 更新丢失, 并发情况下,对同一字段进行更新,就会出现更新丢失,采用乐观锁,比较版本号或时间戳可解决 读未提交 解决了更新丢失但是会引起脏读, 二个session.sessionA中 ...
- Mysql查询优化器之基本优化
对于一个SQL语句,查询优化器先看是不是能转换成JOIN,再将JOIN进行优化 优化分为: 1. 条件优化 2.计算全表扫描成本 3. 找出所有能用到的索引 4. 针对每个索引计算不同的访问方式的成本 ...
- MySQL如何利用索引优化ORDER BY排序语句
MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度. MySQL也能利用索引来快速地执行ORDER BY和GROUP BY语句的排序和分组操作. 通 ...
- MySQL如何利用索引优化ORDER BY排序语句 【转载】
本文转载自:http://blog.csdn.net/ryb7899/article/details/5580624 .感谢相关作者. MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执 ...
- MySQL 多列索引优化小记
MySQL 5.6.30 问题背景 由于爬虫抓取的数据不断增多,这两天在不断对数据库以及查询语句进行优化,其中一个表结构如下: CREATE TABLE `newspaper_article` ( ` ...
随机推荐
- 从零开始封装 vue 组件
对于学习 Vue 的同学来说,封装 vue 组件是实现代码复用的重要一环.在 Vue 官网中非常详细地介绍了 vue 组件的相关知识,我这里简单摘取使用最频繁的几个知识点,带大家快速入门 vue 组件 ...
- 微调baichuan2-7b遇到的显存坑
问题描述: 微调baichuan2-7b模型,验证一轮后继续训练第一个iteration显存大幅增加 项目链接: https://github.com/wp931120/baichuan_sft_lo ...
- 牛客刷Java记录第四天
第一题,单选题 class Car extends Vehicle { public static void main (String[] args) { new Car(). run(); } pr ...
- Go 语言为什么建议多使用切片,少使用数组?
大家好,我是 frank,「Golang 语言开发栈」公众号作者. 01 介绍 在 Go 语言中,数组固定长度,切片可变长度:数组和切片都是值传递,因为切片传递的是指针,所以切片也被称为"引 ...
- Docker安装 配置
Docker的技术原理: 1. Linux 命名空间(Namespaces) 进程命名空间:使得每个容器拥有独立的进程空间,互相隔离,不受其他容器影响. 网络命名空间:提供独立的网络栈,每个容器有自己 ...
- 基于FPGA的数字钟设计---第三版---郝旭帅电子设计团队
本篇为各位朋友介绍基于FPGA的数字钟设计---第三版. 功能说明: 在数码管上面显示时分秒(共计六个数码管,前两个显示小时:中间两个显示分钟:最后两个显示秒). 利用按键可以切换24/12小时制(默 ...
- JavaImprove--Lesson01--枚举类,泛型
一.枚举 认识枚举类 枚举是一种特殊的类 枚举的格式: 修饰符 enmu 枚举类名{ 名称1,名称2: 其它成员 } //枚举类 public enum A { //枚举类的第一列必须是罗列枚举 ...
- 华为云云原生视窗:一文回顾Q1精彩瞬间
摘要:一文速览2023年Q1期间华为云云原生相关动态信息. 华为云云原生动态 华为云海外首发CCI Serverless容器服务 在MWC23 巴展期间,华为云海外首发CCI Serverless容器 ...
- 华为云MVP高浩:打破AI开发瓶颈,解决数据、算法、算力三大难题
摘要:在高浩看来,大量的数字蓝领人才和AI应用开发人员构成了当前AI行业发展人才之基,这也为高校学生就业初期从事的工作指明了方向,而华为ModelArts平台在教育领域有着天然的数据.算法优势,非常适 ...
- 保护客户代码和应用安全,CodeArts有7招
摘要:华为CodeArts致力于各种措施与方案,确保用户研发资产的安全. 华为云有IAM统一认证.CodeArts原名"DevCloud"上每个项目均设有权限管理机制. CodeA ...