查询:
select `r`.`id` as `id`
from `tbl_rls` as `r`
left join `tblc_comment_manager` as `cm` on `cm`.`rlsc_id` != `r`.`id`
Run Code Online (Sandbox Code Playgroud)
两张桌子都有8k记录,但为什么它很慢,有时需要2-3分钟?
OMG,这个查询使mysql服务器失效.会在一秒钟内回复你们的人民:(
建议索引列的所有人都是正确的.是的,我写的查询很愚蠢.谢谢你纠正我.
我刚刚创建了几个查询,它们带来了相同的数据,但使用了不同的数据。第一个使用子查询,第二个使用自连接策略。检查文档,我找到了 ANALYZE 和 EXPLAIN 命令,现在我试图了解哪个查询更好。这是每个查询的 EXPLAIN ANALYZE 的结果。希望有人能给我一些关于结果的解释,如果可能的话,给我一些参考点,在哪里可以找到更多信息,坦克你。
EXPLAIN ANALYZE
SELECT historicoestatusrequisicion_id, requisicion_id, estatusrequisicion_id,
comentario, fecha_estatus, usuario_id
FROM historicoestatusrequisicion
WHERE requisicion_id IN
(
SELECT requisicion_id FROM historicoestatusrequisicion
WHERE usuario_id = 27 AND estatusrequisicion_id = 1
)
ORDER BY requisicion_id, estatusrequisicion_id;
Run Code Online (Sandbox Code Playgroud)
这是结果
"Sort (cost=240.15..242.42 rows=906 width=58) (actual time=72.470..80.575 rows=3066 loops=1)"
" Sort Key: public.historicoestatusrequisicion.requisicion_id, public.historicoestatusrequisicion.estatusrequisicion_id"
" Sort Method: quicksort Memory: 436kB"
" -> Hash Join (cost=96.44..195.65 rows=906 width=58) (actual time=16.198..46.765 rows=3066 loops=1)"
" Hash Cond: (public.historicoestatusrequisicion.requisicion_id = public.historicoestatusrequisicion.requisicion_id)"
" -> Seq …Run Code Online (Sandbox Code Playgroud) 我有两个查询来过滤一些用户ID依赖于问题及其答案.
查询A是(原始版本):
SELECT userid
FROM mem..ProfileResult
WHERE ( ( QuestionID = 4
AND QuestionLabelID = 0
AND AnswerGroupID = 4
AND ResultValue = 1
)
OR ( QuestionID = 14
AND QuestionLabelID = 0
AND AnswerGroupID = 19
AND ResultValue = 3
)
OR ( QuestionID = 23
AND QuestionLabelID = 0
AND AnswerGroupID = 28
AND ( ResultValue & 16384 > 0 )
)
OR ( QuestionID = 17
AND QuestionLabelID = 0
AND AnswerGroupID = 22
AND …Run Code Online (Sandbox Code Playgroud) 我需要帮助来优化此MySQL查询以获得更好,更快的性能.
这是SQL FIDDLEwith Query和表结构.
基本上我有两张桌子
CREATE TABLE IF NOT EXISTS `tbl_category` (
`category_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`category_name` varchar(20) NOT NULL,
`parent_category_id` int(10) unsigned DEFAULT NULL,
PRIMARY KEY (`category_id`),
UNIQUE KEY `category_name` (`category_name`,`parent_category_id`),
KEY `category_parent_id` (`parent_category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- data for table `tbl_auction`
--
+-------------+---------------+--------------------+-----------------+
| category_id | category_name | parent_category_id | category_status |
+-------------+---------------+--------------------+-----------------+
| 1 | Boats | NULL | a |
| 2 | Books | NULL | a | …Run Code Online (Sandbox Code Playgroud) 我一直在阅读许多SQL书籍和文章中,选择性是创建索引的重要因素.如果色谱柱的选择性较低,则索引搜索会带来更大的危害.但这些文章都没有解释原因.任何人都可以解释为什么会这样,或提供相关文章的链接?
我有以下代码(注意includes和.each):
subscribers = []
mailgroup.mailgroup_members.opted_to_receive_email.includes(:roster_contact, :roster_info).each { |m|
subscribers << { :EmailAddress => m.roster_contact.member_email,
:Name => m.roster_contact.member_name,
:CustomFields => [ { :Key => 'gender',
:Value => m.roster_info.gender.present? ? m.roster_info.gender : 'X'
} ]
} if m.roster_contact.member_email.present?
}
subscribers
Run Code Online (Sandbox Code Playgroud)
相应地,我在日志中看到以下内容(即select * from ROSTER_INFO ... IN (...)):
SELECT `ROSTER_INFO`.* FROM `ROSTER_INFO` WHERE `ROSTER_INFO`.`ID` IN ('1450', '1000', '1111')
Run Code Online (Sandbox Code Playgroud)
然而,紧接着之前的查询列表中select * from ROSTER_INFO已经指定了每个ID IN:
RosterInfo Load (84.8ms) SELECT `ROSTER_INFO`.* FROM `ROSTER_INFO` WHERE `ROSTER_INFO`.`ID` = '1450' …Run Code Online (Sandbox Code Playgroud) sql activerecord ruby-on-rails query-optimization ruby-on-rails-3.2
在Teradata我可以使用像...这样的声明
collect statistics on my_table column(col1)
Run Code Online (Sandbox Code Playgroud)
这将收集表上的统计信息并将它们存储在DBC视图中,如ColumnStats,IndexStats和MultiColumnStats.我也认为优化器(解析引擎)会在可用时找到统计信息,并使用它们而不是估计的基数/索引值计数来更好地决定如何执行查询.
这听起来很棒,但我有一些问题.
collect stats吗?collect statistics将不胜感激.我目前使用以下查询,由于数据量(约14个月),大约需要8分钟才能返回结果.有没有办法可以加快速度呢?
有问题的数据库是带有InnoDb引擎的MySQL
select
CUSTOMER as CUST,
SUM(IF(PAGE_TYPE = 'C',PAGE_TYPE_COUNT,0)) AS TOTAL_C,
SUM(IF(PAGE_TYPE = 'D',PAGE_TYPE_COUNT,0)) AS TOTAL_D
from
PAGE_HITS
where
EVE_DATE >= '2016-01-01' and EVE_DATE <= '2016-01-05'
and SITE = 'P'
and SITE_SERV like 'serv1X%'
group by
CUST
Run Code Online (Sandbox Code Playgroud)
数据分区为6个月.进入where子句的每一列都被编入索引.有一些相当多的索引,这将是一个很大的列表,在这里列出.因此,只需用文字进行总结.对于该查询,EVE_DATE + PAGE_TYPE_COUNT是复合指标之一&所以是CUST + SITE_SERV + EVE_DATE,EVE_DATE + SITE_SERV,EVE_DATE + SITE,
主键实际上是一个虚拟自动增量编号.它不是老实说.我无法访问解释计划.我会看到我能为此做些什么.
我很感激有任何帮助来改善这个.
在我的理解中,柱状格式更适合 Map Reduce 任务。即使对于某些列的选择,柱状也能很好地工作,因为我们不必将其他列加载到内存中。
但是在 Spark 3.0 中,我看到这个ColumnarToRow操作被应用于查询计划中,根据我从文档中可以理解的内容将数据转换为行格式。
它比柱状表示的效率如何,支配该规则应用的见解是什么?
对于以下代码,我附上了查询计划。
import pandas as pd
df = pd.DataFrame({
'a': [i for i in range(2000)],
'b': [i for i in reversed(range(2000))],
})
df = spark.createDataFrame(df)
df.cache()
df.select('a').filter('a > 500').show()
Run Code Online (Sandbox Code Playgroud)
mapreduce query-optimization apache-spark apache-spark-sql pyspark
我有一个这样的SQL:
INSERT INTO table1 (column1, column2) (
SELECT column3, column4 FROM table2 WHERE column5 = 'value'
);
Run Code Online (Sandbox Code Playgroud)
table13,500,000 行。table2900,000 行。SELECT column3, column4 FROM table2 WHERE column5 = 'value'返回 NO 寄存器(零)并且需要大约 0.004 秒。INSERT INTO table1 (column1, column2) VALUES ('value', 'value')也需要约 0.004 秒。但是,当我将两者结合在一个INSERT INTO SELECT语句中时(如上所示),大约需要 7.7 秒。有解释吗?有解决办法吗?
sql ×6
mysql ×3
database ×2
activerecord ×1
apache-spark ×1
cpu-time ×1
indexing ×1
join ×1
mapreduce ×1
mariadb ×1
performance ×1
postgresql ×1
pyspark ×1
sql-insert ×1
sql-server ×1
teradata ×1