1.什么是索引
在MySQL中,索引(index)也叫做“键(key)”,它是存储引擎用于快速找到记录的一种数据结构。
mysql索引的三种类型
1. 唯一索引:唯一索引通过确保表中没有两行数据具有相同的键值来帮助维护数据完整性。定义主键时,可以自动应用唯一索引。它确保索引键列中的值是唯一的。
2. 聚集索引:聚集索引对表的物理顺序进行重新排序,并根据键值进行搜索。每个表只有一个聚集索引。
3. 非聚集索引:非聚集索引不会更改表的物理顺序,并且会保持数据的逻辑顺序。每个表可以具有许多非聚集索引。
mysql索引的类型
1. 唯一索引(UNIQUE KEY)
2. 常规索引(INDEX或KEY)
3. 全文索引(FULL TEXT)
4. 主键索引(PRIMARY KEY)
mysql 的存储引擎,myisam和innodb的区别。
1.MyISAM 是非事务的存储引擎,适合用于频繁查询的应用。表锁,不会出现死锁,适合小数据,小并发。适合进行读操作
2.innodb是支持事务的存储引擎,适合于插入和更新操作比较多的应用,设计合理的话是行锁(最大区别就在锁的级别上),适合大数据,大并发。 适合写操作
锁是什么
锁是计算机协调多个进程或线程并发访问某一资源的机制。锁保证数据并发访问的一致性、有效性;锁冲突也是影响数据库并发访问性能的一个重要因素。锁是Mysql在服务器层和存储引擎层的的并发控制。
1. 共享锁与排他锁
共享锁(读锁):其他事务可以读,但不能写。
排他锁(写锁) :其他事务不能读取,也不能写。
2. 表共享读锁 (Table Read Lock):不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;
表独占写锁 (Table Write Lock):会阻塞其他用户对同一表的读和写操作;
3. 乐观锁(Optimistic Lock):假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。 乐观锁不能解决脏读的问题。
乐观锁, 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
悲观锁(Pessimistic Lock):假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。
悲观锁,顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
垂直分表和水平分表
1.垂直分表定义:将一个表按照字段分成多表,每个表存储其中一部分字段;我理解的是将字段分开存表;就是竖向把表拆分;分库一个道理(根据业务分)
通常是把不常用的字段单独放在一张表;
把text,blob等大字段拆分出来放在附表中;
经常组合查询的列放在一张表中;
2.水平分表是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中;我的理解就是单表数据量过大;按照一定规则进行水平拆分(也就是横向拆),来解决mysql性能问题;
3.总结:当数据量大了;我们正常单库的查询、统计等方式就不适合了;我们需要采用其他方法来解决分表分分库后的查询和统计等问题;比如使用redis缓存;ES,kafka消息中间件来处理满足我们的业务需求。
当分页数量特别大;导致查询效率低下怎么办【覆盖索引】
如果我们也要查询所有列,有两种方法,一种是id>=的形式,另一种就是利用join,看下实际情况:
SELECT * FROM product WHERE ID > =(select id from product limit 866613, 1) limit 20
查询时间为0.2秒
另一种写法
SELECT * FROM product a JOIN (select id from product limit 866613, 20) b ON a.ID = b.id
查询时间也很短,赞!
MySQL 事务
1、简单说一下事务:事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行
2、在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务
3、事务具有ACID的几种特性
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别:
包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。[面试时可能会问]
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
mysql 视图简单理解
视图可以理解为持久化得select语句;简化查询;控制数据访问(权限)
mysql 存储函数的理解 可以理解为PHP的方法;对mysql 语句的封装 调用
group_concat( distinct zjb.product_id) 关联查询去重时使用
本文是集合网上资源进行的部分整合;如果有侵权请私信我;我会及时做出调整和删除