基本.
. MySQL如何处理无效数据值?
MySQL会在处理无效数据值时,根据数据类型和使用场景的不同,采取不同的处理方式。主要包括以下几种方式:
数据类型不匹配时,MySQL会自动进行数据类型转换。例如,如果数字类型的字段中存储了字符串类型的数据,MySQL会尝试将其转换为数字类型。如果转换失败,MySQL会将其转换为0或NULL。
字符串类型的字段中存储了超长数据时,MySQL会根据字段的定义,对数据进行截断或报错。一般来说,如果定义了字段的长度,MySQL会对超长数据进行截断。如果没有定义字段长度,MySQL会报错。
若对表中的某个字段定义了非空约束,当插入或更新数据时,如果数据为空或为NULL,MySQL会报错。如果没有定义非空约束,MySQL会将其插入或更新为NULL。
如果插入或更新的数据与表中已有的数据发生冲突(例如,插入或更新数据的主键或唯一约束与已有数据重复),MySQL会采取不同的处理方式。一般来说,MySQL会报错并中止操作,但也可以通过使用ON DUPLICATE KEY UPDATE语句,实现将新数据更新到已有数据中。
简述MySQL内部临时表 ?
MySQL内部临时表是MySQL服务器在处理查询时所创建的一种特殊表,用于临时存储结果集。它的使用可以提高查询效率,尤其对于大型数据的查询、排序和分组查询非常有效。
MySQL内部临时表在大型数据处理、连接和排序查询中都非常有效,但需要注意的是它只能在当前会话中使用,并且在会话结束时将自动被删除。因此,使用临时表时需要注意数据的备份和恢复。
MySQL中in 和exists的区别?
有两点区别:
(1) 使用上的区别:exists中放一个子查询有记录返回true,无记录返回false(NULL也算有记录),in中查询结果集只能有一个字段
(2) 性能上的区别:in要把缓存到内存中,exists不需要缓存结果
in()适合B表比A表数据小的情况
exists()适合B表比A表数据大的情况
当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用.
精选题 80 . MySQL函数NOW() 和 CURRENT_DATE() 有什么区别?
NOW () 命令用于以小时、分钟和秒显示当前年、月、日。
CURRENT_DATE() 仅显示当前年、月和日期。
请问mysql_fetch_array 和 mysql_fetch_object 有什么区别?
mysql_fetch_array() - 将结果行作为关联数组或数据库中的常规数组返回。
mysql_fetch_object – 从数据库中返回一个结果行作为对象。
MySQL 中BLOB 和 TEXT 有什么区别?
BLOB 是一个二进制大对象,可以保存可变数量的数据。
TEXT 是不区分大小写的 BLOB
如何找出最后插入时分配了哪个自动增量?
LAST_INSERT_ID 将返回 Auto_increment 分配的最后一个值,不需要指定表名
当列设置为 AUTO INCREMENT 并且在表中达到最大值时会发生什么?
当达到最大值时,它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。
精选题 70 . 简述什么是堆表?
HEAP 表存在于内存中,它们用于临时的高速存储基础。
• 不允许使用 BLOB 或 TEXT 字段
• 只能使用比较运算符 =、<、>、= >、=<
• HEAP 表不支持 AUTO_INCREMENT
• 索引不应为空
精选题 55 . MySQL 主键使用自增ID还是UUID?
推荐使用自增ID,不要使用UUID。
因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说, 主键索引的B+树叶子节点上存储了主键索引以及全部的数据(按照顺序), 如果主键索引是自增ID,那么只需要不断向后排列即可,如果是UUID, 由于到来的ID与原来的大小不确定,会造成非常多的数据插入,数据移动,然后导致产生很多的内存碎片,进而造成插入性能的下降。
总之,在数据量大一些的情况下,用自增主键性能会好一些。
关于主键是聚簇索引,如果没有主键,InnoDB会选择一个唯一键来作为聚簇索引,如果没有唯一键,会生成一个隐式的主键。
MySQL里记录货币用什么字段类型好?
NUMERIC和DECIMAL类型
. 如何查看 MySQL 是否处于运行状态?
- 查看MySQL的进程是否存在。打开终端或命令提示符,执行命令:ps -ef| grep mysql。如果MySQL的进程存在,则表示MySQL服务正在运行。在Windows系统中,可以使用服务管理器(services.msc)查看MySQL服务的状态。
如何开启或停止 MySQL 服务?
linux
kill -9 进程号
windows
可以使用服务管理器(services.msc)
MySQL有关权限的表 ?
user权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。
db权限表:记录各个帐号在各个数据库上的操作权限。
table_priv权限表:记录数据表级的操作权限。
columns_priv权限表:记录数据列级的操作权限。
host权限表:配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。
MySQL_pconnect是什么? MySQL_connect有什么区别?
MySQL_pconnect()打开一个持久的数据库连接,这意味着数据库不是在每次页面加载的时候被打开一个新连接,因此我们不能使用MySQL_close()来关闭一个持久的连接。
MySQL_pconnect和MySQL_connect最简要的区别是:
与MySQL_pconnect不同,MySQL_connect在每次页面被加载的时候打开连接,这个连接可以使用MySQL_close()语句来关闭。
简述什么是MySQL多实例,如何配置MySQL多实例?
MySQL的多实例有两种方式可以实现,两种方式各有利弊。
第一种是使用多个配置文件启动不同的进程来实现多实例,这种方式的优势逻辑简单,配置简单,缺点是管理起来不太方便。
第二种是通过官方自带的mysqld_multi使用单独的配置文件来实现多实例,这种方式定制每个实例的配置不太方面,优点是管理起来很方便,集中管理。
MySQL binlog的工作模式有哪些?
一,模式1 Row Level:日志中会记录成每一行数据被修改的形式,然后在slave端再对相同的数据进行修改。
二,模式2 Statement Level:每一条会修改数据的sql都会记录到 master的bin-log中。slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql来再次执行。.
三,模式3 Mixed
Mixed模式,可以理解为是前两种模式的结合。
Mixed模式下,MySQL会根据执行的每一条具体的sql语句来区分对待记录的日志形式,也就是在Statement和Row之间选择一种。
MySQL支持的分区类型有哪些?
RANGE分区:这种模式允许将数据划分不同范围。例如可以将一个表通过年份划分成若干个分区
LIST分区:这种模式允许系统通过预定义的列表的值来对数据进行分割。按照List中的值分区,与RANGE的区别是,range分区的区间范围值是连续的。
HASH分区 :这中模式允许通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。例如可以建立一个对表主键进行分区的表。
KEY分区 :上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的
简述MySQL 和 MariaDB 的区别 ?
2、协议不同
MariaDB 使用了 GPLv2 许可证,这意味着任何使用 MariaDB 的应用程序必须是自由和开放源代码的。而 MySQL 使用了 GPL 许可证和商业许可证。这意味着 MySQL 有一个商业版本,该版本的许可证要求付费才能使用。
4、功能不同
MariaDB 比 MySQL 提供了更多的功能。例如,MariaDB 支持更多的数据类型、多源复制、并行复制、表空间管理、虚拟列等。此外,MariaDB 还包括更好的查询优化器、并发性能、查询缓存等,这些功能为用户提供了更好的性能和扩展性。
5、性能不同
MariaDB 比 MySQL 提供了更好的性能和扩展性。例如,MariaDB 在查询优化器方面进行了许多改进,可以更好地优化查询,提高查询性能。此外,MariaDB 还具有更好的并发性能和查询缓存,可以更好地处理高并发负载。
简述MySQL 有哪些数据类型?
整数类型:BIT、BOOL、TINY INT、SMALL INT、MEDIUM INT、 INT、 BIG INT。
浮点数类型:FLOAT、DOUBLE、DECIMAL。
字符串类型:CHAR、VARCHAR、TINY TEXT、TEXT、MEDIUM TEXT、LONGTEXT、TINY BLOB、BLOB、MEDIUM BLOB、LONG BLOB。
日期类型:Date、DateTime、TimeStamp、Time、Year。
其他数据类型:BINARY、VARBINARY、ENUM、SET…
MySQL CHAR 和 VARCHAR的区别?
CHAR 是固定长度的字符类型,VARCHAR 则是可变长度的字符类型,下面讨论基于在 MySQL5.0 以上版本中。
共同点
CHAR(M) 和 VARCHAR(M) 都表示该列能存储 M 个字符,注意不是字节!!
CHAR类型特点
CHAR 最多可以存储 255 个字符 (注意不是字节),字符有不同的编码集,比如 UTF8 编码 (3字节)、GBK 编码 (2字节) 等。
对于 CHAR(M) 如果实际存储的数据长度小于M,则 MySQL 会自动会在它的右边用空格字符补足,但是在检索操作中那些填补出来的空格字符会被去掉。
VARCHAR类型特点
VARCHAR 的最大长度为 65535 个字节。
VARCHAR 存储的是实际的字符串加1或2个字节用来记录字符串实际长度,字符串长度小于255字节用1字节记录,超过255就需要2字节记录
简述MySQL存储过程的机制 ?
存储过程是一组为了完成特定功能的 SQL 语句集合。使用存储过程的目的是将常用或复杂的工作预先用 SQL 语句写好并用一个指定名称存储起来,这个过程经编译和优化后存储在数据库服务器中,因此称为存储过程
- 封装性2) 可增强 SQL 语句的功能和灵活性3) 可减少网络流量4) 高性能5) 提高数据库的安全性和数据的完整性6) 使数据独立
MySQL的存储过程常见命令 ?
关键字:CREATE、PROCEDURE
语法格式:
CREATE PROCEDURE 存储过程名(参数1, 参数2, … ) COMMENT ‘描述文字’
BEGIN
SELECT语句;
END;
sql语句
如何用MySQL命令进行备份和恢复?
mysqldump -u root -p test > test.sql
mysql -u root -p test < test.sql
引擎
Innodb使用的是哪种隔离级别 ?
MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重复读)
Innodb是行锁,那什么时候会产生行锁,什么情况下会变成表锁?
一般情况下,innodb只对指定的行进行锁定,其他进程还是可以对表中的其他行进行操作的,因此,这时候innodb加的就是行锁;
但是,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”。
MySQLl存储引擎有哪些?
MyISAM 具有检查和修复表格的大多数工具。表格可以被压缩,而且支持全文收索
不是事务安全的,而且不支持外键
MEMORY 该类型表存储在内存中,表的索引是哈希分布的。
innodb 这种表是事务安全的。提供了commit(提交) rollback(实务回滚)支持外键,比myisam慢。
MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)的区别?
1.InnoDB支持事务,MyISAM、memory不支持,
2.InnoDB支持外键,MyISAM、memory不支持
3.InnoDB(5.6之后)、myisam支持FULLTEXT类型的索引, memory不支持。
4memory 内存存放 hash索引(默认)
5 innodb 行锁 myisam和memory是表锁
6.InnoDB中不保存表的行数MyISAM只要简单的读出保存好的行数即可
. MySQL的MyISAM与InnoDB两种存储引擎在,事务、锁级别,各自的适用场景?
事务处理上方面
MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。
InnoDB:提供事务支持事务,外部键等高级数据库功能。具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
锁级别
MyISAM:只支持表级锁,用户在操作MyISAM表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。
简述InnoDB 存储引擎有几种锁算法?
Record Lock — 单个行记录上的锁;
Gap Lock — 间隙锁,锁定一个范围,不包括记录本身;
Next-Key Lock — 锁定一个范围,包括记录本身
MySQL的InnoDB 引擎的四大特性是什么?
插入缓冲(Insert buffer)
Insert Buffer 用于非聚集索引的插入和更新操作。先判断插入的非聚集索引是否在缓存池中,如果在则直接插入,否则插入到 Insert Buffer 对象里。再以一定的频率进行 Insert Buffer 和辅助索引叶子节点的 merge 操作,将多次插入合并到一个操作中,提高对非聚集索引的插入性能。
二次写 (Double write)
Double Write 由两部分组成,一部分是内存中的 double write buffer,大小为 2MB,另一部分是物理磁盘上共享表空间连续的 128 个页,大小也为 2MB。在对缓冲池的脏页进行刷新时,并不直接写磁盘,而是通过 memcpy 函数将脏页先复制到内存中的该区域,之后通过 doublewrite buffer 再分两次,每次 1MB 顺序地写入共享表空间的物理磁盘上,然后马上调用 fsync 函数,同步磁盘,避免操作系统缓冲写带来的问题。
自适应哈希索引 (Adaptive Hash Index)
InnoDB 会根据访问的频率和模式,为热点页建立哈希索引,来提高查询效率。索引通过缓存池的 B+ 树页构造而来,因此建立速度很快,InnoDB 存储引擎会监控对表上各个索引页的查询,如果观察到建立哈希索引可以带来速度上的提升,则建立哈希索引,所以叫做自适应哈希索引。
缓存池
为了提高数据库的性能,引入缓存池的概念,通过参数 innodb_buffer_pool_size 可以设置缓存池的大小,参数 innodb_buffer_pool_instances 可以设置缓存池的实例个数。缓存池主要用于存储以下内容:
缓冲池中缓存的数据页类型有:索引页、数据页、undo页、插入缓冲 (insert buffer)、自适应哈希索引(adaptive hash index)、InnoDB存储的锁信息 (lock info)和数据字典信息 (data dictionary)。
MySQL 行级锁、表级锁、页级锁的描述与特点 ?
行级锁:
描述:行级锁是mysql中锁定粒度最细的一种锁。表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突,其加锁粒度最小,但加锁的开销也最大。行级锁分为共享锁和排他锁
特点:开销大,加锁慢,会出现死锁。发生锁冲突的概率最低,并发度也最高。
表级锁:
描述:表级锁是mysql中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分mysql引擎支持。最常使用的MyISAM与InnoDB都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)
特点: 开销小,加锁快,不会出现死锁。发生锁冲突的概率最高,并发度也最低。
页级锁:
描述:页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。因此,采取了折衷的页级锁,一次锁定相邻的一组记录。BDB 支持页级锁。
特点:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
简述MySQL 悲观锁与乐观锁 ?
乐观锁(Optimistic Lock):假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。 乐观锁不能解决脏读的问题。
乐观锁, 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
悲观锁(Pessimistic Lock):假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。
悲观锁,顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
简述MySQL共享锁 、 排他锁 ?
共享锁:
描述:
共享锁又称读锁,是读取操作创建的锁。其他用户可以并发读取数据,但任何事务都不能对数据进行修改(获取数据上的排他锁),直到已释放所有共享锁。
如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。
排他锁:
描述:
排他锁又称写锁、独占锁,如果事务T对数据A加上排他锁后,则其他事务不能再对A加任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。
索引
MySQL中null与空值的区别 ?
1.占用空间区别:空值(’’)的长度是0,是不占用空间的;而的NULL长度是NULL,是占用空间的
2.插入/查询方式区别:NULL值查询使用is null/is not null查询,而空值(’’)可以使用=或者!=、<、>等算术运算符。
3.COUNT 和 IFNULL函数:使用 COUNT(字段) 统计会过滤掉 NULL 值,但是不会过滤掉空值。
4.索引字段说明:在有NULL值的字段上使用常用的索引,如普通索引、复合索引、全文索引等不会使索引失效。在官网查看在空间索引的情况下,说明了 索引列必须为NOT NULL
MySQL 使用全局锁会导致的问题?
如果在主库备份,在备份期间不能更新,业务停止,所以更新业务会处于等待状态
如果在从库备份,在备份期间不能执行主库同步的binlog,导致主从延迟
MySQL left join、right join以及inner join的区别 ?
left join:左关联,主表在左边,右边为从表。如果左侧的主表中没有关联字段,会用null 填满
right join:右关联 主表在右边和letf join相反
inner join: 内关联只会显示主表和从表相关联的字段,不会出现null
简述count(1)、count(*)与count(列名)的执行区别 ?
count(*):包括了所有的列,相当于行数,在统计结果的时候, 不会忽略列值为NULL
count(1):包括了忽略所有列,用1代表代码行,在统计结果的时候, 不会忽略列值为NULL
count(列名):只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数, 即某个字段值为NULL时,不统计。
执行效率上:
列名为主键,count(列名)会比count(1)快
列名不为主键,count(1)会比count(列名)快
如果表多个列并且没有主键,则 count(1) 的执行效率优于 count()
如果有主键,则 select count(主键)的执行效率是最优的
如果表只有一个字段,则 select count()最优。
MySQL 数据库中的主键、超键、候选键、外键是什么?
超键(super key): 在关系中能唯一标识元组的属性集称为关系模式的超键
候选键(candidate key): 不含有多余属性的超键称为候选键。也就是在候选键中,若再删除属性,就不是键了!
主键(primary key): 用户选作元组标识的一个候选键程序主键
外键(foreign key):如果关系模式R中属性K是其它模式的主键,那么k在模式R中称为外键。
MySQL字段为什么要求定义为not null ?
null 值会占用更多的字节,且会在程序中造成很多与预期不符的情况。
简述什么情况下设置了索引但无法使用?
查询条件包含or,可能导致索引失效
like通配符可能导致索引失效。
联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。
精选题 9 . 简述MySQL中有几种索引类型?
FULLTEXT :即为全文索引,innodn(5.6)MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。
HASH :由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。
BTREE :BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。
RTREE :RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。相对于BTREE,RTREE的优势在于范围查找。
简述MySQL 聚簇索引和非聚簇索引的区别 ?
聚簇索引的叶子节点存放的是主键值和数据行,支持覆盖索引
非聚簇索引的叶子节点存放的是主键值或数据记录的地址(InnoDB辅助索引的data域存储相应记录主键的值,MyISAM辅助索引的data域保存数据记录的地址
联合索引
1、联合索引是两个或更多个列上的索引。
对于联合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。
2、利用索引中的附加列,可以缩小搜索的范围,但使用一个具有两列的索引不同于使用两个单独的索引。
复合索引的结构与电话簿类似,人名由姓和名构成,电话簿首先按姓氏对进行排序,然后按名字对有相同姓氏的人进行排序。
如果您知道姓,电话簿将非常有用;如果您知道姓和名,电话簿则更为有用,但如果您只知道名不知道姓,电话簿将没有用处。
常见的索引类型包括B-Tree索引、哈希索引和全文索引。
单列索引
单列索引
定义
单列索引(也称为单字段索引或简单索引)是对一列或多列中的单个字段创建的索引。单列索引包括唯一索引和普通索引两种类型。
唯一索引:索引字段的值必须唯一,或者允许为NULL(但只允许一个NULL值)
普通索引:索引字段的值可以重复。
精选题 14 . Hash 索引和 B+ 树索引有什么区别 ?
hash 索引底层就是 hash 表,进行查找时,调用一次 hash 函数就可以获取到相应的键值,之后进行回表查询获得实际数据。B+ 树底层实现是多路平衡查找树。对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据。
hash 索引进行等值查询更快(一般情况下),但是却无法进行范围查询。
因为在 hash 索引中经过 hash 函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询。而 B+ 树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围。
hash索引任何时候都避免不了回表查询数据,而B+树在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询
hash 索引虽然在等值查询上较快,但是不稳定。性能不可预测,当某个键值存在大量重复的时候,发生 hash 碰撞,此时效率可能极差。而 B+ 树的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,且树的高度较低。
. MySQL 创建索引可以使用多少列?
任何标准表创建最多 16 个索引列。
优化
. 如何提高MySQL insert的性能?
有如下方法:
a)合并多条 insert 为一条,即: insert into t values(a,b,c), (d,e,f) ,
原因分析:主要原因是多条insert合并后日志量(MySQL的binlog和innodb的事务让日志) 减少了,降低日志刷盘的数据量和频率,从而提高效率。通过合并SQL语句,同时也能减少SQL语句解析的次数,减少网络传输的IO。
b)修改参数 bulk_insert_buffer_size, 调大批量插入的缓存;
c)设置 innodb_flush_log_at_trx_commit = 0 ,相对于 innodb_flush_log_at_trx_commit = 1 可以十分明显的提升导入速度;
(备注:innodb_flush_log_at_trx_commit 参数对 InnoDB Log 的写入性能有非常关键的影响。该参数可以设置为0,1,2,解释如下:
0:log buffer中的数据将以每秒一次的频率写入到log file中,且同时会进行文件系统到磁盘的同步操作,但是每个事务的commit并不会触发任何log buffer 到log file 的刷新或者文件系统到磁盘的刷新操作;
1:在每次事务提交的时候将log buffer 中的数据都会写入到log file,同时也会触发文件系统到磁盘的同步;
2:事务提交会触发log buffer 到log file的刷新,但并不会触发磁盘文件系统到磁盘的同步。此外,每秒会有一次文件系统到磁盘同步操作。
)
d)手动使用事务
因为mysql默认是autocommit的,这样每插入一条数据,都会进行一次commit;所以,为了减少创建事务的消耗,我们可用手工使用事务,即START TRANSACTION;insert 。。,insert。。 commit;即执行多个insert后再一起提交;一般1000条insert 提交一次。
MySQL列值为NULL时,查询是否会用到索引?
列值为NULL也是可以走索引的
计划对列进行索引,应尽量避免把它设置为可空,因为这会让 MySQL 难以优化引用了可空列的查询,同时增加了引擎的复杂度
MySQL中如何对Full Text Search全文索引优化?
调整词汇表:MySQL使用自然语言处理库来分析文本,我们可以通过修改MySQL的my.ini文件来调整该库的设置,以便更好地适应我们的环境。
限制搜索范围:如果我们只需要搜索一个特定的列,可以将搜索范围限制在该列上,这样可以提高搜索效率。
调整词汇长度:默认情况下,MySQL会忽略长度少于3个字符的词汇,我们可以将该设置调整为2或1,从而扩大搜索范围。
MSQL设计索引的时候,我们一般需要考虑哪些因素
1.数据量超过三百,理论上应创建索引
2.经常与其他表链接的表,在链接字段应创建索引 on 两边的字段,都要建立索引
3.经常出现在where子句中的字段,尤其是大表,应创建索引
MySQL如何实施Hash索引优化 ?
存储引擎选择:在选择使用Hash索引的存储引擎上,需要尽可能地选择InnoDB引擎,因为InnoDB存储引擎内置Hash索引,能够免去外部维护的成本。
选择合适的Hash函数:选择合适的Hash函数是Hash索引优化的重要一步,因为Hash函数决定了索引的散列方式和影响键值在桶之间分布的程度,进而影响到查询Hash索引的效率。在选择Hash函数时需要考虑业务数据的特点,保证Hash函数的性能指标达到最优。
Hash冲突处理:Hash索引在散列过程中,可能会遇到Hash冲突的问题,这时候需要进行Hash冲突的特殊处理。常见的Hash冲突处理办法有:开放地址法、链接法和二次Hash法等
事务
类型一:RU(READ-UNCOMMITTED 表示读未提交)
可以读取到事务未提交的数据,隔离性差,会出现脏读(当前内存读),不可重复读,幻读问题;
类型二:RC(READ-COMMITTED 表示读已提交)可用可以读取到事务已提交的数据,隔离性一般,不会出现脏读问题,但是会出现不可重复读,幻读问题;
类型三:RR(REPEATABLE-READ 表示可重复读)默认可以防止脏读(当前内存读),防止不可重复读问题,防止会出现的幻读问题,但是并发能力较差;
会使用next lock锁进制,来防止幻读问题,但是引入锁进制后,锁的代价会比较高,比较耗费CPU资源,占用系统性能;
类型四:SR(SERIALIZABLE 可串行化)
隔离性比较高,可以实现串行化读取数据,但是事务的并发度就没有了;这是事务的最高级别,在每条读的数据上,加上锁,使之不可能相互冲突
MySQL事务的特征 ?
1、原子性(Atomicity)
事务的原子性保证事务中包含的一组更新操作是原子的,不可分割的,不可分割是事务最小的工作单位,所包含的操作被视为一个整体,执行过程中遵循“要么全部执行,要不都不执行”,不存在一半执行,一半未执行的情况。
2、一致性(Consistency)
事务的一致性要求事务必须满足数据库的完整性约束,且事务执行完毕后会将数据库由一个一致性的状态变为另一个一致性的状态。事务的一致性与原子性是密不可分的。
3、隔离性(lsolation)
事务的隔离性要求事务之间是彼此独立的,隔离的。及一个事务的执行不可以被其他事务干扰。具体到操作是指一个事务的操作必须在一个事务commit之后才可以进行操作。多事务并发执行时,相当于将并发事务变成串行事务,顺序执行,如同串行调度般的执行事务。
4、持续性(Durability)
事物的持续性也称持久性,是指一个事务一旦提交,它对数据库的改变将是永久性的,因为数据刷进了物理磁盘了,其他操作将不会对它产生任何影响。
. 简述MySQL的事务处理机制 ?
一: 事务(Transaction)就是用户定义的一系列数据库操作,这些操作可以视为一个完成的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。
二:事务的使用
(a)begin transaction表示事务的开启标记。
(b)commit表示事务的提交操作,表示该事务的结束,此时将事务中处理的数据刷到磁盘中(物理数据库磁盘中去)。
©rollback表示事务的回滚操作,表示事务异常结束,此时将事务中已经执行的操撤销回原来的状态。
三:事务产生的过程:
DBMS系统必须对这种并发操作提供一种相应的处理机制来保证,访问彼此之间不受任何干扰,从而保证数据库的正确性不受到破坏,为了避免数据库的不一致性,这种处理机制称之为“并发控制”,其中事务就是为了保证数据的一致性而产生的一种概念和手段(事务不是唯一手段)。