MySql InnoDB Select查询需要更多的时间来生成数据
我有一个MySQL InnoDB表,它使用每天的表结构,一个单独的表来存储每天的数据。每个表由50列组成。由于该表用于存储每个表约1600万行的电信相关CDR数据,因此无法对该表进行规范化 这是表架构:MySql InnoDB Select查询需要更多的时间来生成数据,mysql,innodb,database-performance,Mysql,Innodb,Database Performance,我有一个MySQL InnoDB表,它使用每天的表结构,一个单独的表来存储每天的数据。每个表由50列组成。由于该表用于存储每个表约1600万行的电信相关CDR数据,因此无法对该表进行规范化 这是表架构: CREATE TABLE IF NOT EXISTS <tableName_2018_07_08> ( <col1> int(4) NOT NULL, <col2> timestamp NOT NULL, <col3> varchar(25
CREATE TABLE IF NOT EXISTS <tableName_2018_07_08> (
<col1> int(4) NOT NULL,
<col2> timestamp NOT NULL,
<col3> varchar(255) NOT NULL,
<col4> int(4) NOT NULL,
<col5> varchar(255) NOT NULL,
<col6> varchar(255),
<col7> varchar(255),
<col8> varchar(255),
<col9> varchar(255),
<col10> varchar(255),
<col11> varchar(255),
<col12> varchar(255),
<col13> varchar(255),
<col14> varchar(255),
<col15> varchar(255),
<col16> varchar(255),
<col17> varchar(255),
<col18> varchar(255),
<col19> varchar(255),
<col20> varchar(255),
<col21> varchar(255),
<col22> varchar(255),
<col23> varchar(255),
<col24> varchar(255),
<col25> varchar(255),
<col26> varchar(255),
<col27> varchar(255),
<col28> varchar(255),
<col29> varchar(255),
<col30> varchar(255),
<col31> varchar(255),
<col32> varchar(255),
<col33> varchar(255),
<col34> varchar(255),
<col35> varchar(255),
<col36> varchar(255),
<col37> varchar(255),
<col38> varchar(255),
<col39> varchar(255),
<col40> varchar(255),
<col41> varchar(255),
<col42> varchar(255),
<col43> varchar(255),
<col44> varchar(255),
<col45> varchar(255),
<col46> varchar(255),
<col47> varchar(255),
<col48> varchar(255),
<col49> varchar(255),
<col50> varchar(255),
PRIMARY KEY (<col1>, <col2>, <col3>, <col4>, <col5>)
) ROW_FORMAT=COMPACT ENGINE=InnoDB;
查询的where子句中使用了4个字段
select
cast(<col1> as char),
<col2>,
<col3>,
cast(<col4> as char),
<col5>,
<col6>,
<col6>,
<col7>,
<col8>,
<col9>,
<col10>,
<col11>,
<col12>,
<col13>,
<col14>,
<col15>,
<col16>,
<col16>,
<col17>,
<col18>,
<col19>,
<col20>,
<col21>,
<col22>,
<col23>,
<col24>,
<col25>,
<col26>,
<col27>,
<col28>,
<col29>,
<col30>,
<col31>,
<col32>,
<col33>,
<col34>,
<col35>,
<col36>,
<col37>,
<col38>,
<col39>,
<col40>
FROM
<tabele_2018_03_03>
WHERE
col2 >= '2018-07-01 00:00:00' AND
col2 <= '2018-07-01 02:00:00' AND
col3 = 'Test01' AND col4 = '11'
from time和to time是从前端发送的,另外还有三个筛选器,仅当这些筛选器是从前端发送时才会添加
此查询需要5分钟以上才能得出结果,这是一个问题。由于这只适用于一天,并且每当前端发送数据以获取数据达数天时,都需要10分钟以上的时间 内存?还是Innodb?记忆是不稳定的;除暂存外,不要使用内存 每天一张桌子——通常是糟糕的设计 添加了更多过滤器-让我们看看。您提供的任何查询解决方案可能对其他情况都没有帮助 你想要2小时加1秒钟?检查范围测试 castevent作为char-不必要;即使没有强制转换,输出也无法与字符串区分 如果没有以cdr_timestamp开头的索引,该查询将必须搜索整个表。添加索引可能没有帮助,因为查询可能正在查看表的2/24 可以而且应该应用规范化。当然,数据是以字符串的形式输入的,但是在存储到“事实”表之前,应该转换更多的列。 这将需要额外的一两步。看 该链接提供了一些可以帮助您的提示-您每秒插入大约200行,接近极限,无需采取额外步骤;这为您提供了一些步骤。它提供了一种2-SQL规范化技术来非常有效地实现这一点。如果您的一些查询是摘要报告,那么它将深入研究如何使它们更快。等等 即使对这么多的列盲目使用255,也会带来很大的性能负担 通过使用适当的数据类型,再加上规范化,将显著减少磁盘占用空间,从而提供更高的性能 主键有5列-这太多了。这是唯一标识行的列的最小组合吗 您将如何处理百万行的输出??你不能使用MySQL来汇总/压缩/任何数据吗?5分钟对于定位和铲取这么多数据来说并非不合理 保留…-从长远来看,你可能会发现这种混混并不是最好的做事方式 研究从每列中获得的值,看看它们是否值得标准化。要了解字符串的长度更有意义:
SELECT COUNT(*) AS total_rows,
COUNT(DISTINCT vas_type) AS distinct values,
MAX(CHAR_LENGTH(vas_type)) AS longest
FROM tbl;
如果distinct_值/total_行数>40%,则选择“规格化”截止值。
在VARCHAR中使用最长值加上一个模糊因子。。。。
除非需要utf8,否则请使用字符集latin1。我不清楚您的标题是innodb您的create是memory。您没有可以用来加快查询过滤速度的索引,只能在cdr_时间戳上使用。@p.Salmon:抱歉,memory engine create语句出错。它是InnoDB