千家信息网

优化MYSQL查询的详细方法

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,不知道大家之前对类似优化MYSQL查询的详细方法的文章有无了解,今天我在这里给大家再简单的讲讲。感兴趣的话就一起来看看正文部分吧,相信看完优化MYSQL查询的详细方法你一定会有所收获的。1. 在所有用
千家信息网最后更新 2025年02月01日优化MYSQL查询的详细方法

不知道大家之前对类似优化MYSQL查询的详细方法的文章有无了解,今天我在这里给大家再简单的讲讲。感兴趣的话就一起来看看正文部分吧,相信看完优化MYSQL查询的详细方法你一定会有所收获的。

1. 在所有用于where,order by和group by的列上添加索引

索引除了能够确保唯一的标记一条记录,还能是MySQL云服务器更快的从数据库中获取结果。索引在排序中的作用也非常大。

Mysql的索引可能会占据额外的空间,并且会一定程度上降低插入,删除和更新的性能。但是,如果你的表格有超过10行数据,那么索引就能极大的降低查找的执行时间。

强烈建议使用"最坏情况的数据样本"来测试MySql查询,从而更清晰的了解查询在生产中的行为方式。

假设你正在一个超过500行的数据库表中执行如下的查询语句:

mysql>select customer_id, customer_name from customers where customer_id='345546'

上述查询会迫使Mysql云服务器执行一个全表扫描来获得所查找的数据。

型号,Mysql提供了一个特别的Explain语句,用来分析你的查询语句的性能。当你将查询语句添加到该关键词后面时,MySql会显示优化器对该语句的所有信息。

如果我们用explain语句分析一下上面的查询,会得到如下的分析结果:

mysql> explain select customer_id, customer_name from customers where customer_id='140385';+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+| id | select_type | table     | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+|  1 | SIMPLE      | customers | NULL       | ALL  | NULL          | NULL | NULL    | NULL |  500 |    10.00 | Using where |+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+

可以看到,优化器展示出了非常重要的信息,这些信息可以帮助我们微调数据库表。首先,MySql会执行一个全表扫描,因为key列为Null。其次,MySql云服务器已经明确表示它将要扫描500行的数据来完成这次查询。

为了优化上述查询,我们只需要在customer_id这一列上添加一个索引m即可:

mysql> Create index customer_id ON customers (customer_Id);Query OK, 0 rows affected (0.02 sec)Records: 0  Duplicates: 0  Warnings: 0

如果我们再次执行explain语句,会得到如下结果:

mysql> Explain select customer_id, customer_name from customers where customer_id='140385';+----+-------------+-----------+------------+------+---------------+-------------+---------+-------+------+----------+-------+| id | select_type | table     | partitions | type | possible_keys | key         | key_len | ref   | rows | filtered | Extra |+----+-------------+-----------+------------+------+---------------+-------------+---------+-------+------+----------+-------+|  1 | SIMPLE      | customers | NULL       | ref  | customer_id   | customer_id | 13      | const |    1 |   100.00 | NULL  |+----+-------------+-----------+------------+------+---------------+-------------+---------+-------+------+----------+-------+

从上述的输出结果,显然MySQL云服务器会使用索引customer_id来查询表格。可以看需要扫描的行数为1。虽然我只是在一个行数为500的表格中执行这条查询语句,索引在检索一个更大的数据集的时候优化程度更加明显。

2. 用Union优化Like语句

有时候,你可能需要在查询中使用or操作符进行比较。当or关键字在where子句中使用频率过高的时候,它可能会使MySQL优化器错误的选择全表扫描来检索记录。union子句可以是查询执行的更快,尤其是当其中一个查询有一个优化索引,而另一个查询也有一个优化索引的时候。

比如,在first_name和last_name上分别存在索引的情况下,执行如下查询语句:

mysql> select * from students where first_name like 'Ade%' or last_name like 'Ade%'

上述查询和下面使用union合并两条充分利用查询语句的查询相比,速度慢了许多。

mysql> select * from students where first_name like 'Ade%' union all select * from students where last_name like 'Ade%'

3. 避免使用带有前导通配符的表达式

当查询中存在前导通配符时,Mysql无法使用索引。以上面的student表为例,如下的查询会导致MySQL执行全表扫描,及时first_name字段上加了索引。

mysql> select * from students where first_name like '%Ade'

使用explain分析得到如下结果:

mysql> explain select * from students where first_name like  '%Ade'  ;+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+|  1 | SIMPLE      | students | NULL       | ALL  | NULL          | NULL | NULL    | NULL |  500 |    11.11 | Using where |+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+

如上所示,Mysql将扫描全部500行数据,这将使得查询极其缓慢。

4. 充分利用MySQL的全文检索

如果你正面临着使用通配符查询数据,但是并不想降低数据库的性能,你应当考虑使用MySQL的全文检索(FTS),因为它比通配符查询快得多。除此以外,FTS还能够返回质量更好的相关结果。

添加一个全文检索索引到student样表上的语句如下:

mysql> alter table students add fulltext(first_name, last_name)';mysql> select * from students where match(first_name, last_name) against ('Ade');

在上面的例子中,我们针对搜索关键字Ade指定了想要匹配的列(first_name, last_name)。如果查询优化器如上语句的执行情况,将得到下面的结果:

mysql> explain Select * from students where match(first_name, last_name) AGAINST ('Ade');+----+-------------+----------+------------+----------+---------------+------------+---------+-------+------+----------+-------------------------------+| id | select_type | table    | partitions | type     | possible_keys | key        | key_len | ref   | rows | filtered | Extra                         |+----+-------------+----------+------------+----------+---------------+------------+---------+-------+------+----------+-------------------------------+|  1 | SIMPLE      | students | NULL       | fulltext | first_name    | first_name | 0       | const |    1 |   100.00 | Using where; Ft_hints: sorted |+----+-------------+----------+------------+----------+---------------+------------+---------+-------+------+----------+-------------------------------+

5. 优化数据库架构

规范化

首先,规范化所有数据库表,即使可能会有些损失。比如,如果你需要创建两张表分别用来记录customers和orders数据,你应当在order表上用顾客id引用顾客,而不是反过来。下图显示了没有任何数据冗余而设计的数据库架构。

除此以外,对相似的值使用同一种数据类型类存储。

使用最佳数据类型

MySQL支持各种数据类型,包括integer,float,double,date,datetime,varchar,text等。当设计数据库表时,应当尽可能使用能够满足特性的最短的数据类型。

比如,如果你在设计一个系统用户表,而该用户数量不会超过100个人,你就应该对user_ud使用'TINYINT'类型,该类型的取值范围为-128至128。如果一个字段需要存储date型值,使用datetime类型比较好,因为在查询的时候无需进行复杂的类型转换。

当值全为数字类型时,使用Integer。在进行计算时,Integer类型的值比文本类型的值速度更快。

避免NULL

NULL指该列没有任何值。你应当尽可能的避免这类型的值因为他们会损害数据库结果。比如你需要获得数据库中所有订单金额的和,但是某个订单记录中金额为null,如果不注意空指针,很有可能导致计算结果出现异常。在某些情况下,你可能需要为列定义一个默认值。

看完优化MYSQL查询的详细方法这篇文章,大家觉得怎么样?如果想要了解更多相关,可以继续关注我们的行业资讯板块。

查询 数据 索引 语句 类型 数据库 结果 检索 情况 时候 服务器 通配符 面的 分析 服务 方法 信息 全文 全文检索 关键 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 莒南五中网络安全 区块链可以更改服务器的数据吗 网络安全技术人员招聘 文件共享服务器实时防护病毒 客户端如何加入域服务器 上海常规网络技术网上价格 现在要求国产化数据库了吗 网络安全基础建设用户需求 网络安全与信息化建设的意义 上海手方网络技术有限公司 开店要多少宽带云服务器 软件开发过程中安全管理 腾讯云服务器退款 国家网络安全学院学费 象山财务软件开发公司价格 计算机使用及网络安全培训 今天微信收款音响连接服务器失败 海南蕊润应用软件开发有限公司 visio中导入数据库表 富锦市天气预报软件开发 国家安全部网络安全法 无锡最美服务器 复杂数据库密码设置 编码密码学与网络安全 象山财务软件开发公司价格 网络安全待遇2020 中移在线软件开发怎么样 visio中导入数据库表 阿里巴巴网络技术顾问郭老师 2b2t服务器推荐国际版
0