Mysql索引问题,索引、事务、MVCC、锁、调优、分库分表、Explain、读写分离、ACID、主从复制、幻读,一次总结!

您所在的位置:网站首页 mysql查询表锁 Mysql索引问题,索引、事务、MVCC、锁、调优、分库分表、Explain、读写分离、ACID、主从复制、幻读,一次总结!

Mysql索引问题,索引、事务、MVCC、锁、调优、分库分表、Explain、读写分离、ACID、主从复制、幻读,一次总结!

2023-03-22 17:42| 来源: 网络整理| 查看: 265

一、索引解决了什么问题

1,提升了查询效率,它就像字典的目录,让我们可以快速查找到想要的数据。 2,提高了CPU使用率,由于索引的数据结构是b+树,带着排序功能,所以一定程度上可以达到此目的。 hash 属于无序的数据结构。当进行范围查找的时候无效。 mysql 的索引类型跟存储引擎是相关的,innodb 存储引擎数据文件跟索引文件全部放在ibd文件中,而myisam的数据文件放在myd文件中,索引放在myi文件中,其实区分聚簇索引和非聚簇索引的非常简单。只要判断数据跟索引是否存储在一起就可以了。innodb 存储引擎在进行数据插入的时候,数据必须要跟索引放在一起,如果有主键就使用主键,没有主键就使用唯一建没有唯一索引就使用6字节的rowid,因此跟数据绑定在一起的就是聚簇索引。而为了避免数据坑余存储,其他的索引的叶子节点中存储的都是聚簇索引的key值,因此innodb中既有聚簇索引也有非聚簇索引,而myisam中只有非聚簇索引。

innodb 的四大特性。 一般3-4层的b+tree足以支持千万级别的数据量存储 索引设计的时候尽可能让key占用存储空间。 其他索引的叶子节点中存储的数据不在是整行的记录,而是聚簇索引的id值。 二、索引带来了什么问题 1,占用了磁盘空间,创建索引会占用物理空间的。 2,降低了增删改的效率,为什么这么说呢,因为索引结构是 b+树,每次操作都会btree都会进行一次排序,这便影响了效率 3,不适用于任何场景,比如数据量少的表或者修改操作频繁的字段

1、常用索引类型:

主键索引:主键,值是唯一的,不为null 唯一索引:union,值是唯一的,可为null(这也是和主键索引的区别) 单值索引:index,单个字段,但是一个表可以有多个单值索引 复合索引:index, 多个列组成的索引,类似二级目录,先查找第一个字段,查到数据后再找第二个

2、如何创建,删除,查看索引的格式,下面参考一下即可

创建:create 索引类型 索引名称 on student(s_name); 删除: drop index 索引名 on 表名; 查看: show index from 表名 索引可以大大提高MySQL的检索速度。 避免对索引字段进行计算操作 ◆避免在索引字段上使用not,,!= ◆避免在索引列上使用IS NULL和IS NOT NULL ◆避免在索引列上出现数据类型转换 ◆避免在索引字段上使用函数 ◆避免建立索引的列中使用空值。 (1)索引分 单列索引 和 组合索引。 1、单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。 2、组合索引,即一个索引包含多个列。 (4)索引缺点: 1、虽然索引大大提高了查询速度,同时却会降低更新表的速度, 如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据, 还要保存一下索引文件。过多的使用索引将会造成滥用 索引种类 普通索引:仅加速查询 唯一索引:加速查询 + 列值唯一(可以有null) 主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个 组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并 全文索引:对文本的内容进行分词,进行搜索。 索引对数据库的影响

聚集索引,非聚集索引 MyISAM的索引与行记录是分开存储的,叫做非聚集索引(UnClustered Index)。 MyISAM的索引是一个单独的文件,数据也是一个单独的文件,索引和存储的数据分离。每一个索引都会查找同一份数据。独立运行的。 InnoDB的主键索引与行记录是存储在一起的,故叫做聚集索引(Clustered Index):

索引的设计原则有哪些?

在进行索引设计的时候,应该保证索引字段占用的空间越小越好,这只是一个大的方向,还有一些细节需要注意: 1.适合索引的列时出现在where字句中的列,或者连接子句中指定的列 2基数比较小的表,索引效果比较差,没有必要建立索引 3早选择索引的时候,越短越好,可以指定某列的一部分,没有必要全部字段的值。 4不要给表中的每一个字段都创建索引,并不是索引越多越好 5定义有外键的数据列一定要创建索引 6更新频繁的字段不要有索引 7创建的索引的列不要过多,可以创建组合索引,但是组合索引的列的个数不建议太多 8大文本,大的对象不适合创建索引?

回表操作 id,name ,age,gender id 主键,name普通索引 select * from table where name='zhang'; 先根据name b+tree匹配到对应的叶子节点,查询到对应行记录 的id值,在根据id去id的b+tree中检索整行的记录,这个过程就称为回表操作, 要尽量避免回表操作。 索引覆盖 select id ,name from table where name='zhang'; 先根据name的值去nanme b+tree 检索对应的记录,能获取到id的属性值,索引的叶子节点中包含了 查询的所有列,此时不需要回表,这个过程就成为索引覆盖,using idex 的提示信息,推荐使用 在某些场景中,可以考虑将要查询的所有列都变成组合索引。此时使用索引覆盖,加快查询效率。 索引下推 select id ,name from table where name='zhang' and age=12; 没有索引下推之前: 先根据name 从存储引擎中拉取数据到server层,然后在server层中对age进行数据过滤 有了索引下推之后 根据name和age两个条件来做数据筛选,将筛选之后的结果返回给server层 索引的优化: 一般我们并不是出现了问题菜进行优化的,在进行数据库建模和数据库设 计的时候会预先考虑到一些优化的问, 比如表字段的类型,长度等,包括创建合适的索引等方式,但是这种方式只 能提前的预防。并不一定能解决索引的问题索引 当我们生产的环境中出现sql问题的时候我们从数据库的性能监控, 索引的创建和维护,sql的语句调整。参数的设置, 性能的监控会选择show profiles,performenace ,schema来检测 mysql为什么要主从复制 1.在复杂的系统中,有这么一个情景。有一句sql语句需要锁表。导致暂时不能使用读的服务, 那么就很影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样主库出现了缩表的情景, 通过读从库也可以保证业务的正常运作。 2.做数据的热备 3.架构的扩展,业务量越大。I/O访问频率过高,单机无法满足, 此时做多库的存储,降低磁盘I/O 访问的频率,提高单个机器的I/0性能。 怎么处理mysql的慢查询? 1.开启慢查询日志,准确定位到哪个sql语句出现了问题 2.分析sql语句,看看是否load了额外的数据。可能是查询了多余的行并且抛弃掉了。可能是加载了 许多结果中并不需要的列。对语句进行分析及重写。 3.分析语句的执行计划,然后获得其使用索引的情况。之后修改语句或者修 改索引。使得语句中尽可能的命中索引 4.如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果 是的话,可以进行横向或者纵向分表。 什么是mysql的主从复制? mysql 主从复制时指数据可以从一个mysql数据库服务器主节点复制带哦 一个或多个从节点。mysql默认采取异步的复制方式 (同步的话效率太低,是要提够实时查询的支持) 这样从节点的不用一直访问主服务器的来跟新自己的数据。数据的更新可 以在远程连接上,从节点可以复制主数据库中的所有数据库或者特定的数据 库,或者特定的表。


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3