Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 选择。。。成排性能_Mysql_Performance_Select_Select Into Outfile - Fatal编程技术网

Mysql 选择。。。成排性能

Mysql 选择。。。成排性能,mysql,performance,select,select-into-outfile,Mysql,Performance,Select,Select Into Outfile,我正在尝试优化查询的导出过程。 我有以下表格(我省略了一些不相关的字段): 创建表格\u术语使用( ID int(11)非空自动增量,TTC_艺术_ID int(11)默认为空, TTC_TYP_ID int(11)默认为空, 术语\u OF \u使用\u名称varchar(200)默认为空, 使用值varchar(200)默认为空, 主键(ID) )ENGINE=InnoDB AUTO_INCREMENT=185905671默认字符集=utf8 创建表车辆( ID mediumint(8)无符

我正在尝试优化查询的导出过程。 我有以下表格(我省略了一些不相关的字段):
创建表格\u术语使用(
ID int(11)非空自动增量,TTC_艺术_ID int(11)默认为空,
TTC_TYP_ID int(11)默认为空,
术语\u OF \u使用\u名称varchar(200)默认为空,
使用值varchar(200)默认为空,
主键(ID)
)ENGINE=InnoDB AUTO_INCREMENT=185905671默认字符集=utf8
创建表车辆( ID mediumint(8)无符号非空自动增量, TTC_TYP_ID int(11)无符号非空, 主键(ID), 唯一键TTC_类型_ID_唯一(TTC_类型_ID) )ENGINE=InnoDB AUTO_INCREMENT=44793默认字符集=utf8
创建表格零件( ID int(11)无符号非空自动增量, TTC_ART_ID int(11)无符号非空, 主键(ID), 唯一键TTC\U ART\U ID\U UNIQUE(TTC\U ART\U ID) )ENGINE=InnoDB AUTO_INCREMENT=3732260默认字符集=utf8
创建表项\u的\u使用\u名称( ID smallint(5)无符号非空自动增量, ID_Lang tinyint(3)无符号非空, 名称varchar(200)不为空, 主键(ID,ID_Lang), 唯一密钥名称\u Lang\u UNIQUE(名称、ID\u Lang), 键fk_术语_of_use_name_lang_id_lang_idx(id_lang), 约束fk_术语_of_use_name_lang_id_lang外键(id_lang) 删除时引用lang(ID)更新时不执行任何操作 )ENGINE=InnoDB AUTO_INCREMENT=732默认字符集=utf8
创建表项\u的\u使用\u值( ID mediumint(8)无符号非空自动增量, ID_Lang tinyint(3)无符号非空, 值varchar(200)不为空, 主键(ID,ID_Lang), 唯一键值\u Lang\u UNIQUE(值,ID\u Lang), 键fk_术语_of_use_value_lang_id_lang_idx(id_lang), 约束fk_术语_of_use_value_lang_id_lang外键(id_lang) 删除时引用lang(ID)更新时不执行任何操作 )ENGINE=InnoDB AUTO_INCREMENT=887502默认字符集=utf8 现在,我尝试为csv文件选择一些列。之后,我将把文件导入数据库表,但我认为这不会花费太多时间。 我的Select语句如下所示:

SELECT DISTINCT vehicle.ID, part.ID, term_of_use_name.ID, term_of_use_value.ID FROM _termsofuse
INNER JOIN vehicle ON vehicle.TTC_TYP_ID = _termsofuse.TTC_TYP_ID
INNER JOIN part ON part.TTC_ART_ID = _termsofuse.TTC_ART_ID
INNER JOIN term_of_use_name ON term_of_use_name.Name = _termsofuse.TERM_OF_USE_NAME AND term_of_use_name.ID_Lang = 2
INNER JOIN term_of_use_value ON term_of_use_value.Value = _termsofuse.TERM_OF_USE_VALUE AND term_of_use_value.ID_Lang = 2
INTO OUTFILE 'termsofuse.csv'
CHARACTER SET utf8
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n';

从使用中选择不同的vehicle.ID、part.ID、term_of_use_name.ID、term_of_use_value.ID
车辆上的内部连接车辆。TTC_类型_ID=_termsofuse.TTC_类型_ID
part.TTC\u ART\u ID=\u termsofuse.TTC\u ART\u ID上的内部联接零件
内部连接项\u of \u use\u name ON term\u of \u use\u name.name=\u termsofuse.term\u of \u use\u name和term\u of \u use\u name.ID\u Lang=2
值的项上的项的项的项的值的内部联接项=\u termsofuse.termsofu的项的值和\u的项的值的项的值ID\u Lang=2
输入输出文件“termsofuse.csv”
字符集utf8
以“;”结尾的字段可选地由“”括起
以“\r\n”结尾的行;
这个查询在我的笔记本电脑上花费的时间超过8小时(我有4 GB的RAM)。 我试图查看所选零件的说明,其显示如下:

SELECT DISTINCT vehicle.ID, part.ID, term_of_use_name.ID, term_of_use_value.ID FROM _termsofuse
INNER JOIN vehicle ON vehicle.TTC_TYP_ID = _termsofuse.TTC_TYP_ID
INNER JOIN part ON part.TTC_ART_ID = _termsofuse.TTC_ART_ID
INNER JOIN term_of_use_name ON term_of_use_name.Name = _termsofuse.TERM_OF_USE_NAME AND term_of_use_name.ID_Lang = 2
INNER JOIN term_of_use_value ON term_of_use_value.Value = _termsofuse.TERM_OF_USE_VALUE AND term_of_use_value.ID_Lang = 2
INTO OUTFILE 'termsofuse.csv'
CHARACTER SET utf8
FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\r\n';

我不知道瓶颈到底在哪里。我在不到1小时的时间内导出了一个类似的(约9500万条记录)查询。使用
limit
将结果分解成多个表似乎也没有多大帮助。。。 请看一看,你需要的任何其他信息都告诉我。 提前谢谢你。
编辑2016年1月15日
解释选择的结果

当你有一个非常好的
唯一的
INT
可能是PK时,为什么要有一个
ID

说真的——必须通过一个辅助键来访问会减慢速度。如果每次查找都会使速度减慢2倍,那么这可能就是总数

您有多少RAM?innodb\u buffer\u pool\u size的值是多少?它应该是可用RAM的70%左右


让我们看看
解释选择…
;这里可能有更多的线索。

马上,最大的好处就是将varchars上的连接更改为int,找出一种更好的方法来获取使用术语*表中的数据。或者如果不能在int上连接,至少为使用术语*表中的连接列添加索引。我怀疑(varchar,int)上的索引是主要问题。问题是我想不出一种方法来避免这个问题-ID是自动生成的。连接列是(Name,ID_Lang)索引已经在它们上面了,我不能改进它,是吗?好的,似乎没有索引的
distinct
是一个相当大的问题。我不知道如何解决这个问题。现在关于varchar字段:创建部分(前缀)更好吗索引varchar列或创建一个新列来存储md5值以用于索引?innodb_buffer_pool_大小已设置为1GB。我将使用explain select更新我的问题。你的意思是最好将名称ID_Lang作为PK?问题是,稍后我需要加入ID,ID_Lang。考虑到ID不是t唯一。不同语言上的两个条目应具有相同的(否则自动生成)ID。