`
bmcsy
  • 浏览: 7878 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

MySQL:联合索引与Where子句的优化

阅读更多

本网站系统上线至今,数据量已经不知不觉上到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.products_id IN (472,474)

这样查询需要20多秒,虽然在各个字段上都建立了索引。用分析Explain SQL一分析,发现在第一次分析过程中就返回了几万条数据:

WHERE p.languages_id = 1 ,然后再依次根据条件,缩小范围。

而我改变一下WHERE 字段的位置之后,速度就有了明显地提高:

WHERE p.products_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.products_id IN (472,474),它返回的结果只有不到10条,接下来还要根据其它的条件来过滤,自然在速度上有了较大的提升。

经过实践发现,不要以为WHERE中的字段顺序无所谓,可以随便放在哪,应该尽可能地第一次就过滤掉大部分无用的数据,只返回最小范围的数据。

希望能帮到有同样遭遇的朋友。原文

0
0
分享到:
评论

相关推荐

    MySQL 联合索引与Where子句的优化 提高数据库运行效率

    总结起来,优化MySQL数据库性能的关键在于合理使用联合索引,并理解Where子句的执行顺序。创建合适的索引可以大大提高查询效率,但同时也需要避免索引失效的情况,如不当使用`OR`。同时,编写查询时,需考虑Where...

    MySQL索引原理及慢查询优化1

    例如,避免在索引列上使用函数,减少全表扫描,合理使用JOIN操作,以及避免在WHERE子句中使用OR连接条件,这些都可以显著提高查询效率。 5. **磁盘IO与预读** 磁盘IO是数据库性能的关键瓶颈,因为磁盘读取速度远...

    MySQL 进阶:提高数据库性能和优化查询.md

    ### MySQL 进阶:提高数据库性能和优化查询 #### 引言 MySQL作为一种广泛应用的关系型数据库管理系统,在实际应用中,其性能的优劣直接影响到业务系统的整体效率。本文旨在深入探讨如何通过一系列策略和技术手段来...

    一些关于mysql的面试题和答案

    - 最左匹配原则:联合索引在`WHERE`子句中需按索引顺序使用列。 - 避免函数操作索引列:如`WHERE lower(column)=value`会导致索引失效。 4. **Char和Varchar的区别**: - Char是定长,Varchar是变长,Char适合...

    mysql性能优化综述

    - **分区**:与分表类似,但分区是在单个表内实现的。通过指定条件将数据划分为不同的部分,每部分存储在不同的物理位置,从而提高查询效率。 #### 3. 语句优化 - **Explain分析**:使用`EXPLAIN`命令来检查SQL查询...

    mysql百万量级优化

    - 如果在`WHERE`子句中使用参数(如`@num`),MySQL会在编译时创建访问计划,此时参数的值未知,可能导致索引未被利用。可以通过显式指定索引来强制使用特定索引。 8. **避免在`WHERE`子句中对字段进行表达式或...

    VIP-mysql索引优化实战一(1)1

    在`condition_processing`步骤中,MySQL分析WHERE子句中的条件,评估不同索引的适用性。如果`optimizer_trace`显示MySQL选择了全表扫描而不是索引,可能是因为判断全表扫描成本更低。通过观察`optimizer_trace`的...

    MySQL如何选择合适的索引

    在条件处理步骤中,MySQL会分析WHERE子句中的条件,并进行等式传播、常量传播和无意义条件删除等优化。在表依赖步骤中,MySQL会列出每个表及其依赖关系。在引用优化关键使用步骤中,MySQL会展示如何使用索引来优化...

    MySQL 通过索引优化含ORDER BY的语句

    6. **WHERE + ORDER BY + LIMIT组合优化**:为`WHERE`和`ORDER BY`的列创建联合索引可以进一步提升效率。例如: ```sql SELECT [column1],[column2],…. FROM [TABLE] WHERE [columnX] = [value] ORDER BY [sort] ...

    MySQL技术之索引.pptx

    - 联合索引的创建需考虑字段的查询频率和范围,只有包含等于操作的边界条件才能充分利用索引。 综上所述,理解并合理应用各种索引类型和创建原则,对于提升MySQL数据库的查询性能至关重要。同时,结合业务需求和...

    83案例实战:陌生人社交APP的MySQL索引设计实战(3).pdf

    这可以确保当使用where子句进行过滤时,条件能够尽可能地使用到索引。例如,对于索引(province, city, sex),如果查询条件中常包含省份和城市,这样的设计可以最大化索引的利用率。 2. 联合索引的构建:如果在...

    MySQL数据库索引失效的10种场景.zip

    MySQL无法使用索引进行计算,因此最好将计算操作移到查询的WHERE子句之外。 **6. 联合索引的顺序** 联合索引的顺序非常重要。如果查询条件中列的顺序与索引创建时的顺序不一致,那么索引可能不会被有效利用。 **7....

    MySQL性能优化

    5. **建立联合索引**:根据查询需求合理构建复合索引。 6. **谨慎建立唯一索引**:确保唯一索引不会降低插入性能。 7. **不为大文本字段建立索引**:对于大文本字段,可以考虑使用全文索引。 8. **避免为频繁更新的...

    问题-mysql解答1

    当看到“Using where”和“Using index”一起出现时,意味着查询使用了索引进行过滤(where子句),但不是全索引扫描,可能是因为查询涉及到其他非索引列。使用覆盖索引(Using index)表示查询可以从索引中获取...

    SQL 习惯性优化.doc

    - **优化建议**:为WHERE子句中经常使用的列创建索引,可以显著提高查询效率。 - **示例**:`CREATE INDEX idx_column ON table (column);` #### 二十三、尽可能使用唯一索引 - **优化建议**:创建唯一索引不仅...

    行业-81案例实战:陌生人社交APP的MySQL索引设计实战(一).rar

    - **复合索引**:根据WHERE子句的条件,创建包含多个字段的复合索引,可以进一步优化查询性能。 在实战中,我们还需要关注以下方面: 1. **性能测试与分析**:使用EXPLAIN分析查询计划,找出低效查询并优化。 2. *...

    MySql 5.1 参考手册.chm

    7.2.4. MySQL怎样优化WHERE子句 7.2.5. 范围优化 7.2.6. 索引合并优化 7.2.7. MySQL如何优化IS NULL 7.2.8. MySQL如何优化DISTINCT 7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join ...

    mysqlhaving用法共2页.pdf.zip

    - 尽可能使用索引优化`WHERE`子句,因为`HAVING`通常无法利用索引。 - 在可以的情况下,优先使用`WHERE`进行预筛选,减少分组的数据量,提高效率。 理解并熟练运用`HAVING`子句是提升SQL查询能力的重要步骤,尤其...

    【大厂面试题】MySQL执行计划及SQL优化

    知识点标签:explain、sql优化、索引、sql性能问题 题目描述 MySQL执行计划及SQL优化 1.SQL语句表头运行一个explain时,执行后所显示的表头字段如下: id : select查询的序列号,包含一组数字,表示查询中执行select...

Global site tag (gtag.js) - Google Analytics