1、MySQL批量删除表数据
假设有一个表(syslogs)有1000万条记录,需要在业务不停止的情况下删除其中statusid=1的所有记录,差不多有600万条, 直接执行 DELETE FROM syslogs WHERE statusid=1 会发现删除失败,因为lock wait timeout exceed的错误。
因为这条语句所涉及的记录数太多,因此我们通过LIMIT参数分批删除,比如每10000条进行一次删除,那么我们可以利用 MySQL这样的语句来完成:
DELETE FROM syslogs WHERE status=1 ORDER BY statusid LIMIT 10000;
然后分多次执行就可以把这些记录成功删除。
注意
执行大批量删除的时候注意要使用上limit。因为如果不用limit,删除大量数据很有可能造成死锁。
如果delete的where语句不在索引上,可以先找主键,然后根据主键删除数据库。
平时update和delete的时候最好也加上limit 1 来防止误操作。
2、MySQL中事务的隔离界别
- 脏读:是指一个事务中访问到了另外一个事务未提交的数据。
- 不可重复读:一个事务查询同一条记录2次,得到的结果不一致。(中间有其他事务对数据进行了修改)
- 幻读:一个事务查询2次,得到的记录条数不一致,幻读是不可重复读的一种特殊场景。
- 未提交读 read uncommited 可能造成脏读,不可重复读、幻读。
- 读已提交 read committed 两次读取到的数据不一致,可能造成,不可重复读、幻读。
- 可重复读 repetable read 可能造成幻读。
- 串行化 serializable,读写数据都会锁住整张表,数据操作不会出错。
3、MySQL索引
什么是索引
- 索引是一种用于快速查询和检索数据的数据结构。
- 索引的作用就相当于目录的作用。
索引的优缺点
优点
- 大大加快数据的检索速度(大大减少检索的数据量)-------创建索引的最主要因素
- 通过建立唯一索引,保证数据的唯一性
- 可以加速表和表质检的连接,特别是实现数据完整性方面特别有意义
缺点
- 创建索引和维护索引需要很多时间。这种时间随着数据量的增加而增加。
- 如果一个数据建立了索引,那么增删改这个数据,相应的索引也要进行动态修改,这将大大降低sql的执行效率。
- 需要占用物理存储空间:索引需要使用物理文件存储,也会耗费一定空间。
索引分类
MySQL目前主要有的索引类型为:普通索引、唯一索引、主键索引、组合索引、全文索引。
- 普通索引是最基本的索引,它没有任何限制,值可以为空;仅加速查询。
- 唯一索引与普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
- 主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。在InnoDB中如果删除了主键,MySQL会自动建立长度为6字节的字段rowid作为主键。
- 组合索引指在多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合。
- 全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。fulltext索引配合match against操作使用,而不是一般的where语句加like。它可以在create table,alter table ,create index使用,不过目前只有char、varchar,text 列上可以创建全文索引。值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE index创建fulltext索引,要比先为一张表建立fulltext然后再将数据写入的速度快很多。
4、InnoDB和MyISAM区别
- InnoDB支持事务,MyISAM不支持事务
- InnoDB支持外键,MyISAM不支持外键
- MyISAM性能比InnoDB高,MyISAM支持FULLTEXT类型的全文本搜索,InnoDB不支持FULLTEXT类型的全文本搜索。(Match()、against())
- InnoDB 支持行级锁,MyISAM 不支持行级锁,只支持到表锁
5、清空表的所有数据性能最好的语句
- truncate 清除表数据不会写日志,delete 要写日志,因此 truncate 的效率要高于 delete。
- truncate table 本质是将表删除,重新建立一张表。
6、什么是最左匹配原则?
最左匹配原则指的是索引以最左边为起点任何连续的索引都能匹配上,当遇到范围查询(>、<、between、like)就会停止匹配。
7、事务是什么?它有什么特性?
事务是一系列的数据库操作,是数据库应用的基本单位。在 MySQL 中只有 InnoDB 引擎支持事务。
特性(ACID)
原子性:要么全部执行,要么全部不执行。 一致性:事务的执行使得数据库从一种正确状态转化为另一种正确状态。 隔离性:在事务正确提交之前,不允许把该事务对数据的任何改变提供给其他事务。 持久性:事务提交后,其结果永久保存在数据库中。
8、InnoDB 为什么要使用 B+ 树,而不是 B 树、Hash、红黑树或二叉树?
- B树:不管叶子节点还是非叶子节点,都会保存数据,这样导致在非叶子节点中能保存的指针数量变少(有些资料也称为扇出),指针少的情况下要保存大量数据,只能增加树的高度,导致 IO 操作变多,查询性能变低。
- Hash:虽然可以快速定位,但是没有顺序,IO 复杂度高。
- 二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代价高。
- 红黑树:树的高度随着数据量增加而增加,IO 代价高。
9、MySQL 是如何处理死锁?
- 通过 innodb_lock_wait_timeout 来设置超时时间,一直等待直到超时。
- 发起死锁检测,发现死锁之后,主动回滚死锁中的某一个事务,让其他事务继续执行。
10、InnoDB 如何实现行锁?
只有通过索引条件检索数据,InnoDB 才使用行级锁,否则 InnoDB 将使用表锁。使用 for update 来实现行锁,其中 id 字段必须有索引。
select * from t where id = 1 for update;
11、表的优化策略有哪些?
- 读写分离,主库负责写,从库负责读。
- 根据数据属性单独拆表。
11、连接查询的区别
- left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
- right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
- inner join(等值连接) 只返回两个表中联结字段相等的行