mysql 优化

本文详细介绍了MySQL的SQL语句优化,包括优化INSERT、GROUP BY、ORDER BY和嵌套查询。还讨论了OR条件的优化及使用SQL提示如USE INDEX、IGNORE INDEX和FORCE INDEX。此外,提到了应用层面的优化,如链接池的使用和添加Cache缓存层以提高数据库访问效率,但同时也指出缓存一致性问题的挑战。
摘要由CSDN通过智能技术生成

sql语句优化

优化insert语句

1、如果同时从同一客户插入很多行,尽量使用多个值表的 INSERT 语句,这种方式将大大缩减客户端与数据库之间的连接、关闭等消耗,使得效率比分开执行的单个 INSERT 语句快(在一些情况中几倍)。

2、如果从不同客户插入很多行,能通过使用 INSERT DELAYED 语句得到更高的速度。DELAYED 的含义是让 INSERT 语句马上执行,其实数据都被放在内存的队列中,并没有真正写入磁盘,这比每条语句分别插入要快的多;LOW_PRIORITY 刚好相反,在所有其他用户对表的读写完后才进行插入。

3、将索引文件和数据文件分在不同的磁盘上存放(利用建表中的选项);

4、 如果进行批量插入,可以增加 bulk_insert_buffer_size 变量值的方法来提高速度,但是,这只能对 MyISAM 表使用;

5、当从一个文本文件装载一个表时,使用 LOAD DATA INFILE。这通常比使用很多 INSERT 语句快 20 倍。

优化group by 语句

默认情况下,MySQL 对所有 GROUP BY col1,col2…的字段进行排序。这与在查询中指定ORDER BY col1,col2…类似。因此,如果显式包括一个包含相同的列的 ORDER BY 子句,则对 MySQL 的实际执行性能没有什么影响。如果查询包括 GROUP BY 但用户想要避免排序结果的消耗,则可以指定 ORDER BY NULL

优化order by 语句

在某些情况中,MySQL 可以使用一个索引来满足 ORDER BY 子句,而不需要额外的排序。WHERE 条件和 ORDER BY 使用相同的索引,并且 ORDER BY 的顺序和索引顺序相同,并且ORDER BY 的字段都是升序或者都是降序

下列时会使用索引的情况

SELECT * FROM t1 ORDER BY key_part1,key_part2,... ;

SELECT * FROM t1 WHERE key_part1=1 ORDER BY key_part1 DESC, key_part2 DESC;

SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 DESC;

下列是不使用索引的情况

SELECT * FROM t1 ORDER BY key_part1 DESC, key_part2 ASC;
//order by 的字段混合 ASC 和 DESC

SELECT * FROM t1 WHERE key2=constant ORDER BY key1;
//用于查询行的关键字与 ORDER BY 中所使用的不相同

SELECT * FROM t1 ORDER BY key1, key2;
//对不同的关键字使用 ORDER BY:

优化嵌套查询

在这里插入图片描述
在上面的查询中只有department 使用了索引,employee 并没有使用索引
在这里插入图片描述
改为联合查询,两个表都使用了索引

mysql 优化 or 条件

对于含有 OR 的查询子句,如果要利用索引,则 OR 之间的每个条件列都必须用到索引;如果没有索引,则应该考虑增加索引

使用sql 提示

SQL 提示(SQL HINT)是优化数据库的一个重要手段,简单来说就是在 SQL 语句中加入一些人为的提示来达到优化操作的目的.

use index

在查询语句中表名的后面,添加 USE INDEX 来提供希望 MySQL 去参考的索引列表,就可以让 MySQL 不再考虑其他可用的索引。

--提示参考的索引为index_num 不考虑其他的索引
select * from employee use index(index_num) where num = 1;

ignore index

如果用户只是单纯地想让 MySQL 忽略一个或者多个索引,则可以使用 IGNORE INDEX 作为 HINT

--提示忽略index_name 索引
select * from employee ignore index(index_name) where num=1;

force index

为强制 MySQL 使用一个特定的索引,可在查询中使用 FORCE INDEX 作为 HINT。例如,当不强制使用索引的时候,因为 id 的值都是大于 0 的,因此 MySQL 会默认进行全表扫描,而不使用索引。

--强制使用index_num索引
select * from employee force index(index_num) where num > 0;

应用优化

1、链接池

应用上一般访问数据库,都是先和MySQL Server创建连接,然后发送SQL语句,Server处理完成后,再把结果通过网络返回给应用,然后关闭和MySQL Server的连接,因此短时间大量的数据库访问,消耗的TCP三次握手和四次挥手所花费的时间就很大了,稍微大一点的项目,我们都会在应用访问数据库的那一层上,添加连接池模块,相当于应用和MySQL Server事先创建一组连接,当应用需要请求MySQL Server时,不需要再进行TCP连接和释放连接了,一般连接池都会维护以下资源:

1.连接池里面保持固定数量的活跃TCP连接,供应用使用。

2.如果应用瞬间访问MySQL的量比较大,那么连接池会实时创建更多的连接给应用使用。

3.当连接池里面的TCP连接一段时间内没有被用到,连接池会释放多余的连接资源,保留它设置的最大空闲连接量就可以了。

2、增加Cache缓存层

比较有名的,提高数据库访问效率的缓存层当然是redis和memcache了,一般用缓存把经常访问的数据缓存起来,相当于就是提高了数据库的访问效率。
但是,添加Cache缓存层有一个非常大的问题,就是需要考虑“缓存数据的一致性”问题。
当多个事务并发读取的时候,那么先从缓存命中,如果不能命中,则去数据库中读取,再写缓存,并发读没有问题!

当多个事务进行读写的时候,事务1先写数据库,还没等更新缓存,事务2把缓存的旧值读走了,数据不一致;或者事务1写之前先把缓存删掉,再写数据库,最后写缓存,但是当事务1写数据库还没写完呢,事务2把旧值又读走了,又造成缓存数据不一致的问题!

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值