MySQL 联合索引与Where子句的优化 提高数据库运行效率
发布网友
发布时间:2022-04-07 16:16
我来回答
共1个回答
热心网友
时间:2022-04-07 17:45
网站系统上线至今,数据量已经不知不觉上到500M,近8W记录了。涉及数据库操作的基本都是变得很慢了,用的人都会觉得躁火~~然后把这个情况在群里一贴,包括机器配置什么的一说,马上就有群友发话了,而且帮我确定了不是机器配置的问题,“深圳-*手”热心人他的机器512内存过百W的数据里也跑得飞快,甚至跟那些几W块的机器一样牛(吹过头了),呵呵~~~
在群友的分析指点下,尝试把排序、条件等一个一个去除来做测试,结果发现问题就出在排序部分,去除排序的时候,执行时间由原来的48秒变成0.3x秒,这是个什么档次的变化呀~~看着这个结果我激动ing.....
于是我把涉及排序的字段组成一个联合索引alter
table
xx
add
index
indexname(x1,x2,x3),经过2分钟创建新索引之后再执行同一个SQL语句,哇塞0.28S。。。。爽
于是按照同样的思路把其它几个常用的SQL作了过些优化,效果马上见效
过了30分钟再查slow
sql记录文件,不好了,发现原来一个好好的SQL变得灰常慢了,神马情况?
几经分析和测试原来就是因为添加了联合索引的原因,而且这个SQL语句当中有个or,当把这个or改用union之后问题排除。
这回又得出一个心得:写SQL的时候千万别一时就手,随便写个就OK,那会为以为带来很严重的后果。
再附上一段关于Where子句的执行顺序:
在用MySQL查询数据库的时候,连接了很多个用,发现非常慢。例如:
SELECT
...
WHERE
p.languages_id
=
1
AND
m.languages_id
=
1
AND
c.languages_id
=
1
AND
t.languages_id
=
1
AND
p.procts_id
IN
(472,474)
这样查询需要20多秒,虽然在各个字段上都建立了索引。用分析Explain
SQL一分析,发现在第一次分析过程中就返回了几万条数据:
WHERE
p.languages_id
=
1
,然后再依次根据条件,缩小范围。
而我改变一下WHERE
字段的位置之后,速度就有了明显地提高:
WHERE
p.procts_id
IN
(472,474)
AND
p.languages_id
=
1
AND
m.languages_id
=
1
AND
c.languages_id
=
1
AND
t.languages_id
=
1
这样,第一次的条件是p.procts_id
IN
(472,474),它返回的结果只有不到10条,接下来还要根据其它的条件来过滤,自然在速度上有了较大的提升。
经过实践发现,不要以为WHERE中的字段顺序无所谓,可以随便放在哪,应该尽可能地第一次就过滤掉大部分无用的数据,只返回最小范围的数据。
希望能帮到有同样遭遇的朋友。
MySQL并发连接的优化方法提高数据库效率mysql一个连接并发
2. 调整 MySQL 运行参数 MySQL具有许多可调整的参数,使用正确的参数设置可以充分利用服务器的硬件资源,提高数据库的效率和性能。具体可设置的参数如下:设置 MySQL 数据库连接的最大数目,即同时可以接受的并发数 max_connections = 200 设置 MySQL 数据库最大连接数目之前允许执行的操作数 max_user_co...
ZESTRON表界面分析
在Dr. O.K. Wack Chemie GmbH,我们高度重视ZESTRON的表界面分析技术。该技术通过深入研究材料表面与界面的性质,为提升产品质量与可靠性提供了有力支持。ZESTRON的表界面分析不仅涵盖了相变化、化学反应、吸附与解吸等关键领域,还通过高精度仪器如固体表面Zeta电位分析仪等,确保数据准确可靠。这些分析手段对于优化产品配方、改进生产工艺、预防失效问题等具有重要意义,是我们不断提升产品性能与质量的重要工具。表面污染分析包括评估表面上存在的颗粒、残留物或物质。通过利用显微镜、光谱学和色谱法等技术,分析人员可以识别和表征污染物,以确定其成分和来源。这种分析在电子、制药和制造等各个行业中至关重要,以确保产品质量、性能和安全性。了解表面...
MySQL表索引优化技巧合理地创建和使用两张表的索引mysql两张表索引
索引是MySQL表中非常重要的功能之一,它可以提高查询效率和数据库性能。合理创建和使用两张表的索引可以减少查询时间和资源消耗,并提高MySQL服务器的稳定性和可靠性。为了获得最佳的查询结果,我们应该根据实际的查询需求,为每个表创建不同的索引,并遵循MySQL最佳实践的准则。
如何使用索引提高查询速度
--- where子句中对列的任何操作结果都是在SQL运行时逐列计算得到的,因此它不得不进行表搜索,而没有使用该列上面的索引;如果这些结果在查询编译时就能得到,那么就可以被SQL优化器优化,使用索引,避免表搜索,因此将SQL重写成 下面这样: select * from record where card_no like '5378%'(< 1秒) select * from...
MySQL中关联表之间的关系解密mysql中关联
(4)使用索引连接:对于连接操作和包含WHERE子句的操作,使用目标列和索引列之间的等值比较进行连接,以尽可能减少I/O访问。使用此方法可以在磁盘上先定位索引,然后从索引中读取数据。(5)使用覆盖索引:在只包含索引列的查询结果集中满足查询需要的要求时,引擎就不必钟意数据的原表文件,而只需要基于索...
处理上百万条的数据库如何提高处理查询速度_MySQL
1、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。2、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后...
MySQL括号应用优化查询效率mysql中包含括号
但是当查询数据量较大时,IN语句效率相对较低,此时可以使用括号结合OR来优化,例如:SELECT * FROM students WHERE (class=1 OR class=2 OR class=3)该查询语句与上述查询一致,用括号加OR的方式优化IN语句,提高查询效率。三、MySQL括号应用实例 示例1:查询每个班级成绩最好的学员的个人信息 SELECT ...
MYSQL数据库,如何用一条实现效率高的多结果查询。 就是要一条综合语句...
1.这一个比较快,其实这是把两个SQL 拼接成1个SQL,但是在拼接的时候使用了UNION ,这个过程会排序去重复,这一点上会影响性能。可以把UNION 改成UNION ALL,UNION ALL不会排序去重,可能效率会更好一点 2.这一个不会太快,因为使用in的话,默认是不使用索引的,那么这一个过程会全表扫描,那么...
为什么MySQL不建议建立主键索引mysql不建立主键索引
则数据库实际上会默认为该主键建立聚簇索引,这可能会导致存储空间的浪费。综上所述,虽然在很多情况下主键索引都是MySQL中最常用的索引类型,但我们也不能忽视使用主键索引时可能带来的问题。因此,在使用主键索引时,需要权衡各种因素,并根据具体情况进行选择,以优化查询性能,提高数据库的效率。
MySQL的一机多端口特性提高数据库效率mysql一机多端口
一定要在运行mysqld_multi命令前,先停止所有的MySQL实例。反之,如果在运行mysqld_multi命令时有MySQL实例正在运行,则会出现错误。结论 一机多端口的特性是MySQL的一个重要功能,可以提高数据库的效率、方便账号管理、复制和备份等。在实际应用中,根据需求可以配置多个实例,从而最大化地利用MySQL性能。
MySQL数据库读写速度的优化方法mysql数据库读写速度
此外,要确保MySQL数据库参数正确配置,如数据定义语言中的join_buffer_size参数,可以有效改善大规模数据查询的性能。综上所述,优化MySQL数据库读写速度有很多方法,比如使用索引优化表结构,使用MySQL服务器进行缓存,以及正确配置MySQL数据库系统参数等。通过使用以上方法,可以有效提高MySQL的读写速度。