对 Bulk 数据表偏爱一些 MySql 优化技术

Posted

技术标签:

【中文标题】对 Bulk 数据表偏爱一些 MySql 优化技术【英文标题】:Prefer some MySql Optimization techniques for Bulk data table 【发布时间】:2014-04-11 09:23:12 【问题描述】:

我遇到了mysql中大量数据的查询处理问题。我需要通过连接函数将数据提取到四个以上的表中。查询在服务器上运行非常缓慢。

如何优化多个连接查询的处理时间。

我目前正在使用 innodb 引擎。批量数据表没问题。

我有这样的桌子

这些表中的数据exam,students,subjects,subject_tests,subject_test_mark,total_subject,

我得到所有学生当前考试的记录。

这将由多个 for 循环先前处理。连续数据库访问。那是放慢我的进程的原因。如何通过 SQL 避免这些情况。建议我一些受欢迎的想法。

我对此有些怀疑。表引擎 innodb 好不好。索引是否支持此过程?

SELECT `sub`.student_id,
((sum( `sub`.total / `main`.max_total )) / count( sub.id )) *10 AS percent,
GROUP_CONCAT((sub.total / main.max_total) *10 ORDER BY (sub.total / main.max_total) *10 DESC SEPARATOR ',' ) AS marks
FROM 
`cmark_batch` AS `main`
LEFT JOIN `cmark_para_total` AS `sub` 
ON `sub`.mark_batch_id = `main`.id
WHERE main.batch_id =29
AND main.term =4
AND main.subject_id =64
AND main.status = 'A'
GROUP BY student_id

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra   
1   SIMPLE  main    ref     search  search  8   const   85  Using index condition; Using where; Using temporary; Using filesort
1   SIMPLE  sub     ref     finder  finder  8   newlive.main.id     14  NULL

SELECT t1.mark_batch_id, t1.id, t1.param_name, t1.max_mark,t2.student, t2.mark
FROM `cmark_parameter` AS t1
LEFT JOIN `cmark_parameter_mark` AS t2 ON t1.id = t2.mark_parameter_id
WHERE t1.mark_batch_id
IN (621,620,623,622)
AND t1.status = 'A'
AND t2.status = 'A'
ORDER BY `t2`.`student` ASC

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra   
1   SIMPLE  t2  ALL     NULL    NULL    NULL    NULL    78835   Using where; Using filesort
1   SIMPLE  t1  eq_ref  PRIMARY     PRIMARY     8   newlive.t2.cmark_parameter_id   1   Using where

SELECT t1.student_id, t1.mark_batch_id, t1.total
FROM `cmark_para_total` AS t1
WHERE t1.mark_batch_id
IN (621,620,623,622)
AND t1.status = 'A'
ORDER BY `t1`.`id` ASC


id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra   
1   SIMPLE  t1  range   finder  finder  8   NULL    111     Using index condition; Using where; Using filesort

【问题讨论】:

InnoDB 很好,绝对支持索引。发布您的实际 SQL 查询和表结构,以便我们为您提供帮助。在这种情况下,“查询流”的解释还不够好。 感谢@Tularis,我无法在此处上传表格结构的图片,我的声誉很低。我很快就会编辑 @RyanBabu 我理解正确吗:以“Flow:”开头的段落中的流结果将由一系列查询处理,在嵌套循环中触发? 我编辑了我的帖子@Tularis 【参考方案1】:

您可以使用数据库缓存来减少加载复杂查询的时间。 Mysql 手册中描述了如何启用数据库缓存:

http://dev.mysql.com/doc/refman/5.1/en/query-cache.html

在您的查询中,您必须添加属性 SQL_CACHE 以启用缓存,例如:

SELECT SQL_CACHE id, name FROM customer;

【讨论】:

【参考方案2】:

使用关键字“EXPLAIN”来确定导致缓慢的原因以及您可以采取哪些优化措施。

更多:

https://dev.mysql.com/doc/refman/5.0/en/using-explain.html

【讨论】:

以上是关于对 Bulk 数据表偏爱一些 MySql 优化技术的主要内容,如果未能解决你的问题,请参考以下文章

[15]es线程池的优化

佬技术总监,是这样优化产线MySQL数据库配置的

py-elasticsearch的stream_bulk、parallel_bulk、bulk性能对比

对mysql的高并发优化配置的一些思考

bulk-seq数据和单细胞数据的联合分析

mysql优化