mysqs

1.表结构InnoDB和MyISAM的区别

这两个在数据目录下对应的数据库子目录会创建一个专门用于描绘表结构的文件,以 表名.frm 为结尾的文件。InnoDB还会创建 表名.ibd文件 存储表数据。而MyISAM全是二级索引,数据和索引是分开存放的,所以会对应生成 表名.MYD 存储数据(MYData) 和 表名.MYI 存储索引(MYIndex).   当然在8.0的版本有不一样,InnoDB两个文件合并在 表名.ibd下,MyISAM的 表名.frm 文件变成  表名.xxx.sdi。

InnoDB支持事务和行锁。MyISAM不支持事务,支持表锁,索引都是二级索引。

 

“MySQL的配置文件在windows系统为 my.ini 而在linux或者MacOs是 my.cnf 

2.优化方面

1)索引优化:给查询字段高的添加索引,在添加完索引我们在编写sql语句的时候要防止索引失效,以下是失效情况:类型转换,范围条件右边的列索引失效(所以把范围条件放最后)、不等于(!= 或者<>)索引失效、is null可以使用索引,is not null无法使用索引、 like以通配符%开头索引失效、OR 前后存在非索引的列,索引失效。

   给字符串添加索引:使用前缀索引,,既节省空间,又不用额外增加太多的查询成本,区分度还高。

 

2)关联查询优化:采用左外连接时,给被驱动表加索引,驱动表不用因为他肯定要全表扫描的。采用内连接,换成 inner join(MySQL自动选择驱动表),当用join时,要小表驱动大表。用连接(JOIN)查询来替代子查询。尽量不用子查询是因为Mysql要为内部查询的结果集建立临时表,查询完,会撤销临时表,且不管内存临时表和磁盘临时表就不会存在索引,且如果返回集很大对性能影响会越大。
3)排序优化:SQL 中,可以在 WHERE 子句和 ORDER BY 子句中使用索引,目的是在 WHERE 子句中 避免全表扫描 ,在 ORDER BY 子句 避免使用 FileSort 排序
4)GROUP BY优化
5)服务器语句超时处理:  global也能设置。

6)使用 Redis 作为缓存 ,减少数据库压力。

7)优化MySQL服务器 比如硬件、参数(比如innodb_buffer_pool_size基本都是缓存参数大小)。

8)库级优化:从一主一从,到双主双从。

9)选择适合的 DBMS 

 3.索引

优点:1)降低数据库的IO成本。 2)保证数据的唯一性。3)加速表和表之间的连接(加强子表和父表联合查询速度) 4)减少查询中分组和排序的时间。

缺点:1)创建维护索引耗费时间。2)需要占据磁盘空间。3)减低跟新表的速度,因为数据跟新索引也要维护。

查看表的索引

SHOW INDEX FROM <表名>

create 

 4.表的约束(约束为了保证数据的完整性)constraint

约束对表中字段的限制。

   角度2解释

角度3  

 建表后再重新添加约束,modify

 5.索引条件下推ICP

前一个条件走索引查出100,后一个条件没走索引,先不回表,先从这100条通过第二个条件查询,查询出来的结果再回表。

 6.数据库设计范式

第一、第二、第三、巴斯、第四、第五范式。越往后数据冗余度越低。

1NF告诉我们字段属性需要是原子性,2NF告诉我们一张表就是一个独立的对象,一张表只表达一个意思。

1NF这样是错的,要分成两条

 

2NF

 3NF非主属性不能有依赖关系,必须相互独立。

7.覆盖索引

少一个也算覆盖索引,id也是主键索引,多一个字段就不是覆盖索引。

一个索引包含了满足查询结果的数据就叫做覆盖索引。

 8.sql的优化

 9.定位执行慢的sql:慢查询日志

mysql数据库没有开启慢查询日志,需要调优才启动参数,因为开启会或多或少带来一定性能影响。

 set global slow_query_log='ON'  开启后慢查询会再slow-log里。

10.show profile

 11.explain

extra出现以下的意思

Using where 表示使用where过滤
Using index 表示使用了覆盖索引避免了回表查询

type:system > const > eq_ref > ref > range > index > ALL

 12.group by

where条件用于group by之前,having用于group by 之后对结果进行筛选。

 13sql执行顺序
from->on->join->where->group by->having->select->distinct->order by->limit
 
 14数据库的索引是什么结构,为什么不用哈希表

数据库的索引通常使用B树(或其变种,如B+树)结构来实现。B树是一种多叉平衡搜索树,它能够高效地支持插入、删除和查找操作,并且适用于磁盘存储等场景。

索引的主要目的是提高数据库的查询性能,因此需要满足以下几个要求:

  1. 排序:索引必须按照某种排序方式组织数据,以便支持范围查询和排序操作。B树是一种有序的数据结构,可以很好地满足这个要求。

  2. 快速查找:索引应该支持高效的查找操作,能够快速定位到符合条件的记录。B树通过多层次的节点结构,每层节点包含多个子节点和对应的键值范围,通过比较键值进行二分查找,从而快速定位到目标记录。

  3. 磁盘访问优化:索引的设计应该尽量减少磁盘IO次数,以提高查询效率。B树具有平衡性,每个节点的子节点数量相对较大,使得树的高度相对较小,从而减少了磁盘IO次数。

相比之下,哈希表在某些场景下也可以作为索引的实现方式,但通常不作为数据库索引的首选。原因如下:

  1. 哈希表适合于等值查询:哈希表通过将键值映射到存储桶中,可以快速进行等值查询。然而,对于范围查询、排序操作和模糊查询等,哈希表的性能并不好。

  2. 无序性:哈希表是无序的数据结构,对于需要有序存储和查询的场景,如范围查询和排序操作,哈希表无法直接满足要求。

  3. 冲突处理:哈希表中可能存在哈希冲突的情况,即不同的键值映射到同一个存储桶中。冲突的处理涉及到额外的开销,可能会降低查询效率。

综上所述,B树由于其有序性、快速查找和磁盘访问优化等特点,更适合作为数据库索引的实现方式,而哈希表在某些特定场景下可以作为辅助索引。

 15如何用可重复读的隔离级别避免幻读
1.设置事务隔离级别:将数据库连接的事务隔离级别设置为可重复读。具体的设置方式取决于所使用的数据库管理系统,例如在MySQL中,可以使用SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;语句来设置当前会话的隔离级别。
2.使用快照读:在可重复读隔离级别下,可以使用数据库提供的快照读功能(如MySQL的一致性非锁定读)来读取数据。快照读不会阻塞其他事务的写操作,避免了幻读的问题。
3.避免长事务:尽量避免长时间持有事务,因为长事务会导致其他事务等待锁的释放,增加了幻读的可能性。如果可能的话,尽早提交或回滚事
 怎么判断是长事务
数据库日志分析,事务持续时间,IO操作时间
 
 
 
 
 
 
 
 
 

 

 
posted @   张福祥  阅读(37)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
点击右上角即可分享
微信分享提示