mysql引擎有多种,每种实现的索引方式也不尽相同:
有hash索引,b树索引,b+树索引
我这边接触最大的是innodb引擎:
支持外键和事务:
b+树索引的类型“
1:InnoDB的主键索引(Primary Key)是Cluster形式的(聚簇索引)。: 按主键值生产b+树,叶子节点放的列的数据
2:InnoDB的非主键索引(Secondary Index)是普通的B-Tree索引。 按索引值产生b+树,叶子节点放的对应的主键值
所以二级索引先按索引值找到主键值在按1方式找到数据
mysql按主键key作为内节点;所以选择非常重要
1: 尽量用自增的整形 // 插入的时候直接插入b+树后面
2:不要用随机字符串和uuid等 // 插入的时候要移动b+很多节点
3: 如果没有主键,会选择唯一索引值生成聚簇索引,都没有mysql内部会自动生成自key,效果更佳
4:key的长度不要太大
索引的优化:
1: 最左原则(b+树性质)A B C 联合所以 只能使用到 A ; A B ; A B C
如果要查询A C 可以添加再添加一个联合索引A C
2:范围查询: where A < 100 and A > 90 这个时候 只有第一个A<100才能用到索引,因为这个时候
使用索引会对索引的数据加行锁,
3: order by ,group by 、union 、distinct 等排序字段 :的字段在执行计划中利用了索引时,不用排序操作,否则要排序。
4: 索引字段不能有函数计算和表达式计算: (否则不走索引)
5: 尽量避免使用null,
6: 查询的时候,一个表只能使用一个索引(内部优化选择最好的) 很重要
查询优化:
1: jion代替in子查询
jion原理和优化:
mysql只使用了大名鼎鼎的Nested Loop Join算法:就是通过驱动表的结果集作为循环基础数据,然后一条一条的通过该结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果。如果有多个join,则将前面的结果集作为循环数据,再一次作为循环条件到后一个表中查询数据
join语句的优化
1. 用小结果集驱动大结果集,尽量减少join语句中的Nested Loop的循环总次数;
2. 优先优化Nested Loop的内层循环,因为内层循环是循环中执行次数最多的,每次循环提升很小的性能都 能在整个循环中提升很大的性能;
3. 对被驱动表的join字段上建立索引;
4. 当被驱动表的join字段上无法建立索引的时候,设置足够的Join Buffer Size。
in子查询比jion慢:
唯一不同的是对于in子查询它每次执行内部查询的时候都必须重新构造一个JOIN结构,完成相应的初始化操作,并且在这次内部查询结束之后,要完成相应的析构函数,如index_init,index_end,而当外部查询是全表扫描的时候这些操作的次数就是它的记录数,那么它们(构造,析构)所占用的性能也是显而易见的。简单一句话子查询的性能除了查询外,还消耗在JOIN的构造与析构过程
所以我们在选择in的时候:都不用子查询而是通过:
in(id1, id2, id3) 避免使用 in (select * xxx)
可以考虑:
如: select b, c from A where d = (select max(d) from B) ...
优化为: select b, c from A xa , (select max(d) as md from B) as xd
where xa.d = xd.md
上面介绍的优化,大部分常用;具体分析的时候最好能用decs 或者 explain看下sql执行的情况分析
和优化:
mysql的锁:
推荐阅读: http://hedengcheng.com/?p=771
一个pptf分析很好:
mysql高负载排查思路:
1: top看下mysql进程所占有的cup,和io
2:查看当前连接数和执行的sql语句: show processlist
3:慢查询记录:
- log_slow_queries = /usr/local/mysql/var/slow_queries.log #慢查询日志路径
- long_query_time = 10 #记录SQL查询超过10s的语句
- log-queries-not-using-indexes = 1 #记录没有使用索引的sql
4:找出cpu占用高的sql,然后show processlist看是否在运行,然后看情况是否kill掉
mysql死锁排查:
相关推荐
索引优化:根据查询需求创建适当的索引,避免过多或不必要的索引,以提高查询速度和减少资源消耗。 查询优化:编写高效的SQL查询语句,避免使用慢查询或复杂查询,优化查询语句的逻辑和结构。 配置调优:优化MySQL...
MySQL优化是指通过调整数据库的配置和优化查询语句等方式来提高MySQL数据库的性能和效率。 以下是一些常见的MySQL优化方法和技巧的描述: 优化数据库结构:设计良好的数据库结构可以提高查询效率。包括正确选择...
7.12.5InnoDB和查询缓存319 7.12.6通用查询缓存优化320 7.12.7查询缓存的替代方案321 7.13总结321 …… 第8章优化服务器设置325 第9章操作系统和硬件优化377 第10章复制433 第11章可扩展的MySQL501 第12章...
01-MySQL优化大的思路.wmv 02-Awk简洁入门.wmv 03-观察服务器周期性变化.wmv 04-观察MySQL进程状态.wmv 05-列选取原则.wmv 06-多列索引生效规则.wmv 07-多列索引实验.wmv 08-商城多列索引实验.wmv 09-聚簇索引概念....
MySQL索引优化是提高数据库性能和查询效率的关键步骤之一。索引是一种数据结构,用于快速查找数据库中的记录。合理设计和使用索引可以加快查询速度,并降低系统负载。下面将介绍MySQL索引优化的相关内容。 首先,...
1、实时监控:mysqlstat 可以实时监控 MySQL 服务器的 QPS(每秒查询数)、TPS(每秒事务数)以及网络带宽使用情况等指标。 2、查询分析:它可以展示执行次数最频繁的前N条 SQL 语句,帮助定位查询效率低下的问题,...
2. 性能优化:包括 SQL 查询优化、索引优化、数据表分区、缓存机制等。 3. 备份与恢复:包括数据备份和恢复的方法、备份数据的类型、备份与恢复的策略、日志文件管理等。 4. 数据库设计:包括数据库设计范式、数据库...
本课件先从性能优化的角度,详细解释了索引优化、查询优化、缓存利用等技术手段,给出了示例代码。然后介绍了数据库扩展的垂直和水平两种方式。课件还以高可用性和负载均衡作为案例,讲解了主从复制、读写分离等数据库...
性能优化:MySQL通过多种性能优化技术,如索引、查询优化和内部缓存等,提供了快速的数据处理能力。开发人员可以通过合理地设计数据库结构、优化查询语句和配置参数等方式来提升MySQL的性能。 可扩展性:MySQL支持...
MySQL性能优化 MySQL性能优化就是通过合理安排资源,调整系统参数使MySQL运行更快、更节省资源。MySQL性能优化包括查询速度优化、更新速度优化、MySQL服务器优化等。...优化表结构、索引、查询语句等使查询响
实用又安全的高性能之路就是通过复制来扩展你现有的应用系统,其中也包含了负载平衡、高可用性和故障恢复等技术。 第二版针对第一版作了彻底的修订,极大地扩充了原有内容,对所有领域进行了更深入的论述。新增的...
我们知道一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。 问题:cpu负载过高,...
主要介绍了分析MySQL中索引引引发的CPU负载飙升的问题,文中提到了独立索引所带来的巨大CPU负担,以提醒在MySQL中使用索引要注意CPU负载的问题,需要的朋友可以参考下
MySQL通过高效的缓存机制、查询优化器以及对硬件资源的有效利用,保证了在高负载情况下的稳定性和快速响应。它支持水平扩展(如通过分片、复制等技术)和垂直扩展(如增加硬件资源),以应对大规模数据存储和高并发...
实用又安全的高性能之路就是通过复制来扩展你现有的应用系统,其中也包含了负载平衡、高可用性和故障恢复等技术。 本书第二版针对第一版作了彻底的修订,极大地扩充了原有内容,对所有领域进行了更深入的论述。...