文章目录
1.mysql 数据库中,什么情况下设置了索引但无法使用?
(1) 索引的作用:
在数据库表中对字段建立索引可以大大提高查询速度。
(2) Mysql 索引类型:
a) 普通索引
b) 唯一索引:唯一索引列的值必须唯一允许有空值,如果是组合索
引,则列值的组合必须唯一:
CREATE UNIQUE INDEX indexName ON mytable(username(length)) – 修改表结构
ALTER mytable ADD UNIQUE [indexName] ON (username(length)) – 创建表的时候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16)NOT NULL, UNIQUE [indexName] (username(length)) );
c) 主键索引:一种特殊的唯一索引,不允许有空值,一般在创建表
的时候创建主键索引:
CREATE TABLE mytable( ID INT NOT NULL, usernameVARCHAR(16) NOT NULL, PRIMARY KEY(ID) );
d) 组合索引:CREATE TABLE mytable( ID INT NOT NULL, usernameVARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL, age INTNOT NULL );
为了进一步榨取 MySQL 的效率,就要考虑建立组合索引。就是将 name, city, age 建到一个索引里:代码如下:ALTER TABLE mytable ADD INDEX name_city_age
(name(10),city,age);
(3) 什么情况下有索引,但用不上?
a) 如果条件中有 OR,即使其中有部分条件带索引也不会使用。注
意:要想使用 or,又想让索引生效,只能将 or 条件中的每个列
都加上索引。
b) 对于多了索引,不是使用的第一部分,则不会使用索引。
c) Like 查询以%开头,不使用索引
d) 存在索引列的数据类型隐形转换,则用不上索引,比如列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
e) Where 子句里对索引列上有数学运算,用不上索引
f) Where 子句中对索引列使用函数,用不上索引
g) Mysql 估计使用全表扫描要比用索引快,不使用索引
(4) 什么情况下不推荐使用索引?
a) 数据唯一性差的字段不要使用索引
b) 频繁更新的字段不要使用索引
c) 字段不在 where 语句中出现时不要添加索引,如果 where 后含
IS NULL/IS NOT NULL/LIKE ‘%输入符%’等条件,不要使用索引
d) Where 子句里对索引使用不等于(<>),不建议使用索引,效果一般
2. mysql 优化会不会,mycat 分库,垂直分库,水平分库?
(1) 为查询缓存优化你的查询
(2) EXPLAIN select 查询:explain 的查询结果会告诉你索引主键是如何被利用的
(3) 只需要一行数据时使用 limit1
(4) 为搜索字段添加索引
(5) 在关联表的时候使用相当类型的例,并将其索引
(6) 千万不要 ORDER BY RAND()
(7) 避免 select*
(8) 永远为每张表设置一个 ID
(9) 使用 ENUM 而不是 VARCHAR
(10) 从 PROCEDURE ANALYS()提取建议
(11) 尽可能的使用 NOT NULL
(12) Java 中使用 Prepared Statements
(13) 无缓冲的查询
(14) 把 IP 地址存成 UNSIGNED INT
(15) 固定表的长度
垂直分库:
“垂直分割”是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的。
水平分库:
“水平分割”是一种把数据库中的表按行变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的。
(18) 越小的列会越快
(19) 选择正确的存储引擎
(20) 使用一个对象关系映射器
(21) 小心永久链接
(22) 拆分大的 DELETE 活 INSERT 语句
3.分布式事务解决方案?
(1) 什么是分布式事务?
a. 什么情况下需要用到分布式事务?
a) 当本地数据库断电、机器宕机、网络异常、消息丢失、消息乱序、数据错误、不可靠 TCP、存储数据丢失、其他异常等需要用到分布式事务。
b) 例如:当本地事务数据库断电的这种秦光,如何保证数据一致性?数据库由连个文件组成的,一个数据库文件和一个日志文件,数据库任何写入操作都要先写日志,在操作前会吧日志文件写入磁盘,那么断电的时候及时才做没有完成,在重启数据库的时候,数据库会根据当前数据情况进行 undo 回滚活 redo 前滚,保证了数据的强一致性。
c) 分布式理论:当单个数据库性能产生瓶颈的时候,可能会对数据库进行分区(物理分区),分区之后不同的数据库不同的服务器上 ,此时单个数据库的 ACID 不适应这种清苦啊,在此集群环境下很难达到集群的 ACID,甚至效率性能大幅度下降,重要的是再很难扩展新的分区了。此时就需要引用一个新的理论来使用这种集群情况:CAP 定理
d) CAP定理:由加州肚饿伯克利分销Eric Brewer教授提出,指出WEB服务无法同时满足 3 个属性:
a. 一致性:客户端知道一系列的操作都会同时发生
(生效)
b. 可用性:每个操作都必须以可预期的响应结束
c. 分区容错性:及时出现单组件无法可用,操作依然可以完成。具体的将在分布式系统中,在任何数据库设计中,一个 WEB 应至多只能同时支持上面两个属性。设计人员必须在一致性和可用性之间做出选择。
e) BASE 理论:分布式系统中追求的是可用性,比一致性更加重要,BASE 理论来实现高可用性。核心思想是:我们无法做到羟乙酯,单每个应用都可以根据自身的业务特点,采用适当的方式使系统达到最终一致性。
f) 数据库事务特性:ACID
i. 原子性
ii. 一致性
iii. 独立性或隔离性
iv. 持久性
(2) 分布式系统中,实现分布式事务的解决方案:
a. 两阶段提交 2PC
b. 补偿事务 TCC
c. 本地消息表(异步确保)
d. MQ 事务消息
e. Sagas 事务模型
4.sql 语句优化会不会,说出你知道的?
(1) 避免在列上做运算,可能会导致索引失败
(2) 使用 join 时应该小结果集驱动大结果集,同时把复杂的 join 查询拆分成多个 query,
不然 join 越多表,会导致越多的锁定和堵塞。
(3) 注意 like 模糊查询的使用,避免使用%%
(4) 不要使用 select * 节省内存
(5) 使用批量插入语句,节省交互
(6) Limit 基数比较大时,使用 between and
(7) 不要使用 rand 函数随机获取记录
(8) 避免使用 null,建表时,尽量设置 not nul,提高查询性能
(9) 不要使用 count(id),应该使用 count(*)
(10) 不要做无谓的排序,尽可能在索引中完成排序
(11) From 语句中一定不要使用子查询
(12) 使用更多的 where 加以限制,缩小查找范围(13) 合理运用索引
(14) 使用 explain 查看 sql 性能
5.mysql 的存储引擎了解过没有?
(1) MySQL 存储引擎种类:

(4) 事务处理:在整个流程中出现任何问题,都能让数据回滚到最开始的状态,这种处理方式称之为事务处理。也就是说事务处理要么都成功,要么的失败。
6. 红黑树原理?
(1) 红黑树的性质:红黑树是一个二叉搜索树。在每个节点增加了一个存储位记录节点
的颜色,可以是 RED,也可以是 BLACK,通过任意一条从根到叶子简单路径上颜色
的约束,红黑树保证最长路径不超过最短路径的两倍,加以平衡。性质如下:
i. 每个节点颜色不是黑色就是红色
ii. 根节点的颜色是黑色的
iii. 如果一个节点是红色,那么他的两个子节点就是黑色的,
没有持续的红节点
iv. 对于每个节点,从该节点到其后代叶节点的简单路径上,
均包含相同数目的黑色节点。
本文探讨了在哪些情况下Mysql的索引无法使用,包括OR条件、%开头的LIKE查询、数据类型转换等,并介绍了索引类型如普通索引、唯一索引和主键索引。此外,还讲解了mysql的优化策略,如垂直分库、水平分库、避免全表扫描等。最后提到了分布式事务的解决方案和sql语句优化方法。
5万+

被折叠的 条评论
为什么被折叠?



