- 浏览: 586244 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (365)
- Tomcat调优 (2)
- Apache Http (20)
- Webserver安装 (5)
- Linux安装 (28)
- Linux常用命令 (17)
- C语言及网络编程 (10)
- 文件系统 (0)
- Lucene (12)
- Hadoop (9)
- FastDFS (8)
- 报表 (0)
- 性能测试 (1)
- JAVA (18)
- CSharp (3)
- C++ (38)
- BI (0)
- 数据挖掘 (0)
- 数据采集 (0)
- 网址收集整理 (3)
- Resin (0)
- JBoss (0)
- nginx (0)
- 数据结构 (1)
- 随记 (5)
- Katta (1)
- Shell (6)
- webservice (0)
- JBPM (2)
- JQuery (6)
- Flex (41)
- SSH (0)
- javascript (7)
- php (13)
- 数据库 (6)
- 搜索引擎排序 (2)
- LVS (3)
- solr (2)
- windows (1)
- mysql (3)
- 营销软件 (1)
- tfs (1)
- memcache (5)
- 分布式搜索 (3)
- 关注的博客 (1)
- Android (2)
- clucene (11)
- 综合 (1)
- c c++ 多线程 (6)
- Linux (1)
- 注册码 (1)
- 文件类型转换 (3)
- Linux 与 asp.net (2)
- perl (5)
- coreseek (1)
- 阅读器 (2)
- SEO (1)
- 励志 (1)
- 在线性能测试工具 (1)
- yii (7)
- 服务器监控 (1)
- 广告 (1)
- 代理服务 (5)
- zookeeper (8)
- 广告联盟 (0)
- 常用软件下载 (1)
- 架设自已的站点心得 (0)
最新评论
-
terry07:
java 7 用这个就可以了 Desktop desktop ...
关于java Runtime.getRunTime.exec(String command)的使用 -
HSINKING:
怎么设置打开的dos 窗口是指定的路径下
关于java调用bat文件,不打开窗口 -
liubang201010:
hyperic hq更多参考资料,请访问:http://www ...
hyperic-hq -
^=^:
STDIN_FILENO是unistd.h中定义的一个numb ...
深入理解dup和dup2的用法 -
antor:
留个记号,学习了
[转]用java流方式判断文件类型
from http://topic.csdn.net/u/20110921/16/7d335c53-4d88-4fca-b150-b1d165fa588a.html
引用
如题,我现在 有一张表。。。里面的数据大概就是 800w 条左右,当然以后也可能会更多,这个表会频繁的更新!
我现在的处理是:每次更新 都会先truncate 这张表(因为里面的数据 已经不需要了),然后我会 drop index !
这样之后我会去 insert 数据 。。。。(这些数据量 有可能过千万。。级别的) ,之后就是为数据建立索引!
建立索引的过程很慢。。。800w 数据 现在执行了 半个小时 还没有完成。。。。。建立索引的 字段的类型是 varchar。。。
(这里只能是varhcar 之前有试过 建立多列索引。。那样需要建立 6 列 。。耗时 大概 1 小时左右!如果数据量更大 那么时间
会更长。。。) 有没有更好的解决办法。。或者 怎么优化一下mysql 数据库。。
对我有用[0]丢个板砖[0]引用举报管理TOP回复次数:36
wfevgch
(聪明的一休)
等 级:
#1楼 得分:0回复于:2011-09-21 17:02:02首先查询字段用char会好些
你数据量大,不妨试一下,先建索引,当然insert速度会慢,你把innodb_flush_log_at_trx_commit置为0后进行insert,比较一下速度。
对我有用[0]丢个板砖[0]引用举报管理TOP精华推荐:求SSAS中的计算成员中属性成员的使用
wIloverYou123456789
(wIloverYou123456789)
等 级:
#2楼 得分:0回复于:2011-09-21 17:04:25引用 1 楼 wfevgch 的回复:
首先查询字段用char会好些
你数据量大,不妨试一下,先建索引,当然insert速度会慢,你把innodb_flush_log_at_trx_commit置为0后进行insert,比较一下速度。
我知道。。我是先 insert 之后 才去建立的 index 。。。。
你的意思是先建立 index 然后调整 mysql 的 innodb_flush_log_at_trx_commit 。。。这样一来 在执行
insert into 数据的操作 速度 会 提高么?
对我有用[0]丢个板砖[0]引用举报管理TOP精华推荐:MySQL--- FAQ(2008-10-30更新)
wwwwb
等 级:
9
23
23
#3楼 得分:0回复于:2011-09-21 17:04:391种方法:用SELECT INTO OUTFILE导出记录,
TRUNCATE 此TABLE,建立索引,用LOAD DATA INIFILE再导入
对我有用[0]丢个板砖[0]引用举报管理TOP精华推荐:用C#/.NET挑战一下VFP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#4楼 得分:0回复于:2011-09-21 17:13:44引用 3 楼 wwwwb 的回复:
1种方法:用SELECT INTO OUTFILE导出记录,
TRUNCATE 此TABLE,建立索引,用LOAD DATA INIFILE再导入
我现在就是这么做的。。。。into file 。。。导入数据不慢,也就是三四分钟的事情。。问题在于我导入之后 要执行一些查询 和统计 ,这个过程很忙!!我要优化的就是 查询和统计。。为了解决这个问题。。我想到的就是去建立索引!但是 为800w 条数据建立索引 是个很慢的过程 ,希望能在建立索引的时候 提高速度和效率!
对我有用[0]丢个板砖[0]引用举报管理TOP精华推荐:MDX 如何 翻译 转换 为 SQL 脚本
WWWWA
(aaaa)
等 级:
2
12
15
#5楼 得分:0回复于:2011-09-21 17:16:10我现在就是这么做的:
你的步骤是这样?先建立索引
RUNCATE 此TABLE,建立索引,用LOAD DATA INIFILE再导入
对我有用[0]丢个板砖[0]引用举报管理TOP精华推荐:关于项目相互引用的问题
wIloverYou123456789
(wIloverYou123456789)
等 级:
#6楼 得分:0回复于:2011-09-21 17:20:06引用 5 楼 wwwwa 的回复:
我现在就是这么做的:
你的步骤是这样?先建立索引
RUNCATE 此TABLE,建立索引,用LOAD DATA INIFILE再导入
是的。。你的理解是对的。。我就是这么做的!!!但是 。导入速度还可以。。问题就是建立索引。。然后查询 和统计!!! 。。这是问题的关键!!
对我有用[0]丢个板砖[0]引用举报管理TOP
wwwwb
等 级:
9
23
23
#7楼 得分:0回复于:2011-09-21 17:25:17问题就是建立索引:再问一次,你是在导入数据前建立的索引还是导入后建立的,仔细看看我的建议
用SELECT INTO OUTFILE导出记录,TRUNCATE 此TABLE,建立索引,用LOAD DATA INIFILE再导入
对我有用[0]丢个板砖[0]引用举报管理TOP
ACMAIN_CHM
(acmain)
等 级:
2
6
更多勋章 #8楼 得分:0回复于:2011-09-21 17:28:47你的索引是什么? 贴一下你的create table 和 create index
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#9楼 得分:0回复于:2011-09-21 17:29:37引用 7 楼 wwwwb 的回复:
问题就是建立索引:再问一次,你是在导入数据前建立的索引还是导入后建立的,仔细看看我的建议
用SELECT INTO OUTFILE导出记录,TRUNCATE 此TABLE,建立索引,用LOAD DATA INIFILE再导入
我是 truncate table 之后 就 load data inifile 。。。然后 create index
。。你的意思 是 让我的 create index 在 load data inifile 之前? 。。好吧我去试试。。看看效果如何 。。
现在按照我之前的做法 。。index 还没有建立完全。。。
对我有用[0]丢个板砖[0]引用举报管理TOP
wwwwb
等 级:
9
23
23
#10楼 得分:0回复于:2011-09-21 17:30:58。你的意思 是 让我的 create index 在 load data inifile 之前?
对,3楼就建议了,要仔细看看别人的回复哦
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#11楼 得分:0回复于:2011-09-21 17:32:51引用 7 楼 wwwwb 的回复:
问题就是建立索引:再问一次,你是在导入数据前建立的索引还是导入后建立的,仔细看看我的建议
用SELECT INTO OUTFILE导出记录,TRUNCATE 此TABLE,建立索引,用LOAD DATA INIFILE再导入
create table insert_database (red_ball varchar(50));
create index redball_insertdatabase on insert_database (red_ball);
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#12楼 得分:0回复于:2011-09-21 17:33:38引用 10 楼 wwwwb 的回复:
。你的意思 是 让我的 create index 在 load data inifile 之前?
对,3楼就建议了,要仔细看看别人的回复哦
我需要设置 innodb_flush_log_at_trx_commit 么??
对我有用[0]丢个板砖[0]引用举报管理TOP
wwwwb
等 级:
9
23
23
#13楼 得分:0回复于:2011-09-21 17:34:11导入数据速度如何?数据量多大?
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#14楼 得分:0回复于:2011-09-21 17:35:38引用 13 楼 wwwwb 的回复:
导入数据速度如何?数据量多大?
数据量 大概就是 800w 条数据。。。文件时一个txt 文件。。大概 140M 左右。。当然有可能 以后的文件。会更大!!
对我有用[0]丢个板砖[0]引用举报管理TOP
wwwwb
等 级:
9
23
23
#15楼 得分:0回复于:2011-09-21 17:36:41导入数据试试速度
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#16楼 得分:0回复于:2011-09-21 17:53:18引用 14 楼 wiloveryou123456789 的回复:
引用 13 楼 wwwwb 的回复:
导入数据速度如何?数据量多大?
数据量 大概就是 800w 条数据。。。文件时一个txt 文件。。大概 140M 左右。。当然有可能 以后的文件。会更大!!
要设置 innodb_flush_log_at_trx_commit 。。这个 参数么??
怎么设置呢?在哪里 设置?配置文件??
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#17楼 得分:0回复于:2011-09-21 17:59:48引用 15 楼 wwwwb 的回复:
导入数据试试速度
这样做。。导入的时候速度很慢!!! (前提是我没有 设置 innodb_flush_log_at_trx_commit 不知道设置之后会不会有提高?)
对我有用[0]丢个板砖[0]引用举报管理TOP
ACMAIN_CHM
(acmain)
等 级:
2
6
更多勋章 #18楼 得分:0回复于:2011-09-21 18:14:58你的语句是什么?
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#19楼 得分:0回复于:2011-09-21 18:19:37引用 18 楼 acmain_chm 的回复:
你的语句是什么?
create table insert_database (red_ball varchar(50));
create index redball_insertdatabase on insert_database (red_ball); ..
这是建立表的 语句 和 。。创建索引的 语句。。。
load data local infile 'XX.txt' into table Insert_database fields terminated by '\t' lines terminated by '\r\n'
这是导入文件的语句。。。
现在按照 15 楼说的。。。导入速度很慢 我用navicat 工具导入。。他的速度 是这样的。。200 秒 执行了 当然文件的 4% !!! 速度缓慢啊。。(我没有设置 innodb_flush_log_at_trx_commit 不知道如果设置了 会是什么结果)
我之前是 先导入文件在创建索引。。。四分钟左右搞定!!!但是这样。。创建索引的时候很慢。。。
对我有用[0]丢个板砖[0]引用举报管理TOP
wfevgch
(聪明的一休)
等 级:
#20楼 得分:0回复于:2011-09-21 18:30:18先建索引,再执行set GLOBAL innodb_flush_log_at_trx_commit = 0;再倒入数据;
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#21楼 得分:0回复于:2011-09-21 18:41:00引用 20 楼 wfevgch 的回复:
先建索引,再执行set GLOBAL innodb_flush_log_at_trx_commit = 0;再倒入数据;
我现在是按照。。这种方式 搞的。。。。貌似 速度也是和 innodb_flush_log_at_trx_commit 默认设置没有太大
的差别。。。 如果设置。。innodb_flush_log_at_trx_commit = 2; 倒是速度上有了一点点提高。。
但是提高也不大!!!
我刚才测试的结果
innodb_flush_log_at_trx_commit = 1 耗时 200 秒 插入了整个文件的 4% 左右!!
innodb_flush_log_at_trx_commit = 0 耗时 200 秒 插入了整个文件的 5% 左右!!
innodb_flush_log_at_trx_commit = 2 耗时 200 秒 插入了整个文件的 11% 左右!!
对我有用[0]丢个板砖[0]引用举报管理TOP
wfevgch
(聪明的一休)
等 级:
#22楼 得分:0回复于:2011-09-21 18:47:14这不可能吧,你是用的innodb吗?
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#23楼 得分:0回复于:2011-09-21 18:51:40引用 22 楼 wfevgch 的回复:
这不可能吧,你是用的innodb吗?
你说 的是。。数据库 类型么?
我不太清楚。。我对mysql 不太熟悉。。。怎么看数据库类型呢? 或者表类型呢?
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#24楼 得分:0回复于:2011-09-21 18:59:10我刚才查看了一下。。表的结构。。是 innodb 类型的。。
对我有用[0]丢个板砖[0]引用举报管理TOP
wwwwb
等 级:
9
23
23
#25楼 得分:0回复于:2011-09-22 08:32:35直接在用MYSQL -uroot -p<123.sql 导入试试
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#26楼 得分:0回复于:2011-09-22 09:21:52引用 25 楼 wwwwb 的回复:
直接在用MYSQL -uroot -p<123.sql 导入试试
mysql -u root -p root XXX.txt ..我的数据 是纯数据没有sql 语句 txt 里面全部是纯数据!!!能这样导入么?
对我有用[0]丢个板砖[0]引用举报管理TOP
iihero
(iihero)
等 级:
3
2
#27楼 得分:0回复于:2011-09-22 09:28:12索引创建慢,主要跟磁盘IO有关系。
你把varchar(N)换成char(N),应该会快些。另外,调大key-buffer之类的参数试试。
对我有用[0]丢个板砖[0]引用举报管理TOP
wwwwb
等 级:
9
23
23
#28楼 得分:0回复于:2011-09-22 09:28:25哦,你是用SELECT INTO OUTFILE
只能用LOAD DATA INIFILE才行,你在命令行下执行LOAD DATA INIFILE试试
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#29楼 得分:0回复于:2011-09-22 09:37:20引用 27 楼 iihero 的回复:
索引创建慢,主要跟磁盘IO有关系。
你把varchar(N)换成char(N),应该会快些。另外,调大key-buffer之类的参数试试。
key-buffer
这个参数应该在哪里调整???mysql.ini? 还是??。。。。
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#30楼 得分:0回复于:2011-09-22 09:42:32引用 28 楼 wwwwb 的回复:
哦,你是用SELECT INTO OUTFILE
只能用LOAD DATA INIFILE才行,你在命令行下执行LOAD DATA INIFILE试试
我现在执行导入的步骤是这样的:
先建立了 表 create table insert_database(red_ball char(50));
然后设置 innodb_flush_log_at_trx_commit = 0;
然后建立index create index redball_insertdatabase on insert_database(red_ball);
然后执行导入:load data local infile 'XXX.txt' into table Insert_database fields terminated by '\t' lines terminated by '\r\n'(我是从 9:42分执行的 导入 操作)
到现在为止 还在执行。。
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#31楼 得分:0回复于:2011-09-22 10:27:39引用 28 楼 wwwwb 的回复:
哦,你是用SELECT INTO OUTFILE
只能用LOAD DATA INIFILE才行,你在命令行下执行LOAD DATA INIFILE试试
正如我所说 先建立索引 设置 innodb_flush_log_at_trx_commit = 0; 然后执行导入:load data local infile 'XXX.txt' into table Insert_database fields terminated by '\t' lines terminated by '\r\n'
这个过程很慢 至少是从 10:12 到现在为止 一直 在执行 。。。(我在mysql 控制台也看不到进度!!)
然而 如果 我们不建立索引 设置 innodb_flush_log_at_trx_commit = 0; 然后执行导入:load data local infile 'XXX.txt' into table Insert_database fields terminated by '\t' lines terminated by '\r\n'
也就 三四分钟的事情 !!貌似 设不设置 innodb_flush_log_at_trx_commit 没有太大的 关系!!!
但是我知道如果先导入了 数据在建立 索引 这个过程很耗时!!!前面那种方式我知道是在 导入数据的时候就添加好索引!!!(但是第一种方式我也看不到 执行进度,在mysql 控制台黑屏 。。看不到 如果 用navicat 这个工具来 执行导入 貌似 不管执行哪种方式的导入 速度都很慢!!!)
顺便说一下我的目的吧。。我是想把 数据导入之后 做一个统计查询!!!就这样。。如果不建立索引 我知道
查询 速度很慢!!!但是建立索引 又是一个很耗时的过程 。。。有没有一种方式 不建立索引 也能提高查询和 统计的速度的。。。。
目前的统计语句是这样的。。。
第一个sql :统计总的 记录条数(用于分页)
select count(*) from (select rb.red_ball,count(1) from insert_database rb group by rb.red_ball having count(1)=1) as temp
第二个 sql:就是 查询语句 在分页上面使用
select rb.red_ball,count(1) from insert_database rb group by rb.red_ball having count(1)=1
limit x,x
还有一个导出 的:
select * from (select rb.red_ball,count(1) from insert_database rb group by rb.red_ball having count(1)=1) as temp into outfile 'xxx.txt' fields terminated by '\t' lines terminated by '\r\n'
又没办法实现不是建立索引能提高 查询和 统计速度的方式。。? 期待 大牛出现!
对我有用[0]丢个板砖[0]引用举报管理TOP
wfevgch
(聪明的一休)
等 级:
#32楼 得分:0回复于:2011-09-22 14:11:431 我不了解你表里的业务逻辑,red_ball是什么值,如果可以的话,是否能通过小表用编号维护red_ball,这样实际数据就可以编号,这样效率会提高很多,一般情况下,我们不应该在字符串上建索引,实在没办法,也只能用char类型,而不是varchar
2 关于innodb_flush_log_at_trx_commit,我不知道你的实际环境,你不妨做个实验,一个简单的循环insert百万数据量,innodb_flush_log_at_trx_commit不同的设置,执行时间上差别很大,是几十分钟和几十秒的区别
对我有用[0]丢个板砖[0]引用举报管理TOP
qinchende
(cd.NET)
等 级:
#33楼 得分:0回复于:2011-09-22 17:41:59不知道楼主用的MySQL版本如何?
我建议最好升级MySQL到最新的5.5.x,实践证明5.5.x在索引的处理上跟5.1.x 5.0.x比,那就是火箭跟乌龟的区别!!!
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#34楼 得分:0回复于:2011-09-22 17:49:58引用 33 楼 qinchende 的回复:
不知道楼主用的MySQL版本如何?
我建议最好升级MySQL到最新的5.5.x,实践证明5.5.x在索引的处理上跟5.1.x 5.0.x比,那就是火箭跟乌龟的区别!!!
好吧。。我下载个。。5.5试试 。。但是我之前安装5.5的时候。。貌似执行不了。truncate table table_name 的操作。。。
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#35楼 得分:0回复于:2011-09-22 17:53:08引用 32 楼 wfevgch 的回复:
1 我不了解你表里的业务逻辑,red_ball是什么值,如果可以的话,是否能通过小表用编号维护red_ball,这样实际数据就可以编号,这样效率会提高很多,一般情况下,我们不应该在字符串上建索引,实在没办法,也只能用char类型,而不是varchar
2 关于innodb_flush_log_at_trx_commit,我不知道你的实际环境,你不妨做个实验,一个简单的循环insert百万数……
我明白你的意思:
你第一条件建议 就是建议我按照 数据库范式 来做! 现在我的 red_ball 类型已经是char 了。。
关于第二条件建议 我还真没有使用 循环一个 insert 来做!!!因为我现在导入数据 是使用load data local infile 在mysql 控制台我也看不到速度!!! 只能通过navicat 这样的恐惧 来导入。。
通过相同的时间 来比较 文件导入的进度!!!
不过很感谢你的建议! 不知道有没有更好的办法。。比如像 33 楼所说。。。。
对我有用[0]丢个板砖[0]引用举报管理TOP
wfevgch
(聪明的一休)
等 级:
#36楼 得分:0回复于:2011-09-22 18:22:31关于innodb_flush_log_at_trx_commit的试验你不妨做一下(限麻烦的话,可以联系我给你测试代码)
因为innodb_flush_log_at_trx_commit的效果太明显,我也想知道你的环境到底有什么问题。
如果想用insert语句的话,你可以用mysqldump把表的insert语句导出来执行。
不过我个人觉得文件导入的话,最终也是应该生成insert语句,而且是支持批处理的,就是insert *** values (),(),()...;理论上效率应该更高。
引用 35 楼 wiloveryou123456789 的回复:
引用 32 楼 wfevgch 的回复:
1 我不了解你表里的业务逻辑,red_ball是什么值,如果可以的话,是否能通过小表用编号维护red_ball,这样实际数据就可以编号,这样效率会提高很多,一般情况下,我们不应该在字符串上建索引,实在没办法,也只能用char类型,而不是varchar
2 关于innodb_flush_log_at_trx_commit,我不知道你的实际环境,……
我现在的处理是:每次更新 都会先truncate 这张表(因为里面的数据 已经不需要了),然后我会 drop index !
这样之后我会去 insert 数据 。。。。(这些数据量 有可能过千万。。级别的) ,之后就是为数据建立索引!
建立索引的过程很慢。。。800w 数据 现在执行了 半个小时 还没有完成。。。。。建立索引的 字段的类型是 varchar。。。
(这里只能是varhcar 之前有试过 建立多列索引。。那样需要建立 6 列 。。耗时 大概 1 小时左右!如果数据量更大 那么时间
会更长。。。) 有没有更好的解决办法。。或者 怎么优化一下mysql 数据库。。
对我有用[0]丢个板砖[0]引用举报管理TOP回复次数:36
wfevgch
(聪明的一休)
等 级:
#1楼 得分:0回复于:2011-09-21 17:02:02首先查询字段用char会好些
你数据量大,不妨试一下,先建索引,当然insert速度会慢,你把innodb_flush_log_at_trx_commit置为0后进行insert,比较一下速度。
对我有用[0]丢个板砖[0]引用举报管理TOP精华推荐:求SSAS中的计算成员中属性成员的使用
wIloverYou123456789
(wIloverYou123456789)
等 级:
#2楼 得分:0回复于:2011-09-21 17:04:25引用 1 楼 wfevgch 的回复:
首先查询字段用char会好些
你数据量大,不妨试一下,先建索引,当然insert速度会慢,你把innodb_flush_log_at_trx_commit置为0后进行insert,比较一下速度。
我知道。。我是先 insert 之后 才去建立的 index 。。。。
你的意思是先建立 index 然后调整 mysql 的 innodb_flush_log_at_trx_commit 。。。这样一来 在执行
insert into 数据的操作 速度 会 提高么?
对我有用[0]丢个板砖[0]引用举报管理TOP精华推荐:MySQL--- FAQ(2008-10-30更新)
wwwwb
等 级:
9
23
23
#3楼 得分:0回复于:2011-09-21 17:04:391种方法:用SELECT INTO OUTFILE导出记录,
TRUNCATE 此TABLE,建立索引,用LOAD DATA INIFILE再导入
对我有用[0]丢个板砖[0]引用举报管理TOP精华推荐:用C#/.NET挑战一下VFP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#4楼 得分:0回复于:2011-09-21 17:13:44引用 3 楼 wwwwb 的回复:
1种方法:用SELECT INTO OUTFILE导出记录,
TRUNCATE 此TABLE,建立索引,用LOAD DATA INIFILE再导入
我现在就是这么做的。。。。into file 。。。导入数据不慢,也就是三四分钟的事情。。问题在于我导入之后 要执行一些查询 和统计 ,这个过程很忙!!我要优化的就是 查询和统计。。为了解决这个问题。。我想到的就是去建立索引!但是 为800w 条数据建立索引 是个很慢的过程 ,希望能在建立索引的时候 提高速度和效率!
对我有用[0]丢个板砖[0]引用举报管理TOP精华推荐:MDX 如何 翻译 转换 为 SQL 脚本
WWWWA
(aaaa)
等 级:
2
12
15
#5楼 得分:0回复于:2011-09-21 17:16:10我现在就是这么做的:
你的步骤是这样?先建立索引
RUNCATE 此TABLE,建立索引,用LOAD DATA INIFILE再导入
对我有用[0]丢个板砖[0]引用举报管理TOP精华推荐:关于项目相互引用的问题
wIloverYou123456789
(wIloverYou123456789)
等 级:
#6楼 得分:0回复于:2011-09-21 17:20:06引用 5 楼 wwwwa 的回复:
我现在就是这么做的:
你的步骤是这样?先建立索引
RUNCATE 此TABLE,建立索引,用LOAD DATA INIFILE再导入
是的。。你的理解是对的。。我就是这么做的!!!但是 。导入速度还可以。。问题就是建立索引。。然后查询 和统计!!! 。。这是问题的关键!!
对我有用[0]丢个板砖[0]引用举报管理TOP
wwwwb
等 级:
9
23
23
#7楼 得分:0回复于:2011-09-21 17:25:17问题就是建立索引:再问一次,你是在导入数据前建立的索引还是导入后建立的,仔细看看我的建议
用SELECT INTO OUTFILE导出记录,TRUNCATE 此TABLE,建立索引,用LOAD DATA INIFILE再导入
对我有用[0]丢个板砖[0]引用举报管理TOP
ACMAIN_CHM
(acmain)
等 级:
2
6
更多勋章 #8楼 得分:0回复于:2011-09-21 17:28:47你的索引是什么? 贴一下你的create table 和 create index
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#9楼 得分:0回复于:2011-09-21 17:29:37引用 7 楼 wwwwb 的回复:
问题就是建立索引:再问一次,你是在导入数据前建立的索引还是导入后建立的,仔细看看我的建议
用SELECT INTO OUTFILE导出记录,TRUNCATE 此TABLE,建立索引,用LOAD DATA INIFILE再导入
我是 truncate table 之后 就 load data inifile 。。。然后 create index
。。你的意思 是 让我的 create index 在 load data inifile 之前? 。。好吧我去试试。。看看效果如何 。。
现在按照我之前的做法 。。index 还没有建立完全。。。
对我有用[0]丢个板砖[0]引用举报管理TOP
wwwwb
等 级:
9
23
23
#10楼 得分:0回复于:2011-09-21 17:30:58。你的意思 是 让我的 create index 在 load data inifile 之前?
对,3楼就建议了,要仔细看看别人的回复哦
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#11楼 得分:0回复于:2011-09-21 17:32:51引用 7 楼 wwwwb 的回复:
问题就是建立索引:再问一次,你是在导入数据前建立的索引还是导入后建立的,仔细看看我的建议
用SELECT INTO OUTFILE导出记录,TRUNCATE 此TABLE,建立索引,用LOAD DATA INIFILE再导入
create table insert_database (red_ball varchar(50));
create index redball_insertdatabase on insert_database (red_ball);
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#12楼 得分:0回复于:2011-09-21 17:33:38引用 10 楼 wwwwb 的回复:
。你的意思 是 让我的 create index 在 load data inifile 之前?
对,3楼就建议了,要仔细看看别人的回复哦
我需要设置 innodb_flush_log_at_trx_commit 么??
对我有用[0]丢个板砖[0]引用举报管理TOP
wwwwb
等 级:
9
23
23
#13楼 得分:0回复于:2011-09-21 17:34:11导入数据速度如何?数据量多大?
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#14楼 得分:0回复于:2011-09-21 17:35:38引用 13 楼 wwwwb 的回复:
导入数据速度如何?数据量多大?
数据量 大概就是 800w 条数据。。。文件时一个txt 文件。。大概 140M 左右。。当然有可能 以后的文件。会更大!!
对我有用[0]丢个板砖[0]引用举报管理TOP
wwwwb
等 级:
9
23
23
#15楼 得分:0回复于:2011-09-21 17:36:41导入数据试试速度
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#16楼 得分:0回复于:2011-09-21 17:53:18引用 14 楼 wiloveryou123456789 的回复:
引用 13 楼 wwwwb 的回复:
导入数据速度如何?数据量多大?
数据量 大概就是 800w 条数据。。。文件时一个txt 文件。。大概 140M 左右。。当然有可能 以后的文件。会更大!!
要设置 innodb_flush_log_at_trx_commit 。。这个 参数么??
怎么设置呢?在哪里 设置?配置文件??
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#17楼 得分:0回复于:2011-09-21 17:59:48引用 15 楼 wwwwb 的回复:
导入数据试试速度
这样做。。导入的时候速度很慢!!! (前提是我没有 设置 innodb_flush_log_at_trx_commit 不知道设置之后会不会有提高?)
对我有用[0]丢个板砖[0]引用举报管理TOP
ACMAIN_CHM
(acmain)
等 级:
2
6
更多勋章 #18楼 得分:0回复于:2011-09-21 18:14:58你的语句是什么?
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#19楼 得分:0回复于:2011-09-21 18:19:37引用 18 楼 acmain_chm 的回复:
你的语句是什么?
create table insert_database (red_ball varchar(50));
create index redball_insertdatabase on insert_database (red_ball); ..
这是建立表的 语句 和 。。创建索引的 语句。。。
load data local infile 'XX.txt' into table Insert_database fields terminated by '\t' lines terminated by '\r\n'
这是导入文件的语句。。。
现在按照 15 楼说的。。。导入速度很慢 我用navicat 工具导入。。他的速度 是这样的。。200 秒 执行了 当然文件的 4% !!! 速度缓慢啊。。(我没有设置 innodb_flush_log_at_trx_commit 不知道如果设置了 会是什么结果)
我之前是 先导入文件在创建索引。。。四分钟左右搞定!!!但是这样。。创建索引的时候很慢。。。
对我有用[0]丢个板砖[0]引用举报管理TOP
wfevgch
(聪明的一休)
等 级:
#20楼 得分:0回复于:2011-09-21 18:30:18先建索引,再执行set GLOBAL innodb_flush_log_at_trx_commit = 0;再倒入数据;
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#21楼 得分:0回复于:2011-09-21 18:41:00引用 20 楼 wfevgch 的回复:
先建索引,再执行set GLOBAL innodb_flush_log_at_trx_commit = 0;再倒入数据;
我现在是按照。。这种方式 搞的。。。。貌似 速度也是和 innodb_flush_log_at_trx_commit 默认设置没有太大
的差别。。。 如果设置。。innodb_flush_log_at_trx_commit = 2; 倒是速度上有了一点点提高。。
但是提高也不大!!!
我刚才测试的结果
innodb_flush_log_at_trx_commit = 1 耗时 200 秒 插入了整个文件的 4% 左右!!
innodb_flush_log_at_trx_commit = 0 耗时 200 秒 插入了整个文件的 5% 左右!!
innodb_flush_log_at_trx_commit = 2 耗时 200 秒 插入了整个文件的 11% 左右!!
对我有用[0]丢个板砖[0]引用举报管理TOP
wfevgch
(聪明的一休)
等 级:
#22楼 得分:0回复于:2011-09-21 18:47:14这不可能吧,你是用的innodb吗?
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#23楼 得分:0回复于:2011-09-21 18:51:40引用 22 楼 wfevgch 的回复:
这不可能吧,你是用的innodb吗?
你说 的是。。数据库 类型么?
我不太清楚。。我对mysql 不太熟悉。。。怎么看数据库类型呢? 或者表类型呢?
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#24楼 得分:0回复于:2011-09-21 18:59:10我刚才查看了一下。。表的结构。。是 innodb 类型的。。
对我有用[0]丢个板砖[0]引用举报管理TOP
wwwwb
等 级:
9
23
23
#25楼 得分:0回复于:2011-09-22 08:32:35直接在用MYSQL -uroot -p<123.sql 导入试试
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#26楼 得分:0回复于:2011-09-22 09:21:52引用 25 楼 wwwwb 的回复:
直接在用MYSQL -uroot -p<123.sql 导入试试
mysql -u root -p root XXX.txt ..我的数据 是纯数据没有sql 语句 txt 里面全部是纯数据!!!能这样导入么?
对我有用[0]丢个板砖[0]引用举报管理TOP
iihero
(iihero)
等 级:
3
2
#27楼 得分:0回复于:2011-09-22 09:28:12索引创建慢,主要跟磁盘IO有关系。
你把varchar(N)换成char(N),应该会快些。另外,调大key-buffer之类的参数试试。
对我有用[0]丢个板砖[0]引用举报管理TOP
wwwwb
等 级:
9
23
23
#28楼 得分:0回复于:2011-09-22 09:28:25哦,你是用SELECT INTO OUTFILE
只能用LOAD DATA INIFILE才行,你在命令行下执行LOAD DATA INIFILE试试
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#29楼 得分:0回复于:2011-09-22 09:37:20引用 27 楼 iihero 的回复:
索引创建慢,主要跟磁盘IO有关系。
你把varchar(N)换成char(N),应该会快些。另外,调大key-buffer之类的参数试试。
key-buffer
这个参数应该在哪里调整???mysql.ini? 还是??。。。。
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#30楼 得分:0回复于:2011-09-22 09:42:32引用 28 楼 wwwwb 的回复:
哦,你是用SELECT INTO OUTFILE
只能用LOAD DATA INIFILE才行,你在命令行下执行LOAD DATA INIFILE试试
我现在执行导入的步骤是这样的:
先建立了 表 create table insert_database(red_ball char(50));
然后设置 innodb_flush_log_at_trx_commit = 0;
然后建立index create index redball_insertdatabase on insert_database(red_ball);
然后执行导入:load data local infile 'XXX.txt' into table Insert_database fields terminated by '\t' lines terminated by '\r\n'(我是从 9:42分执行的 导入 操作)
到现在为止 还在执行。。
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#31楼 得分:0回复于:2011-09-22 10:27:39引用 28 楼 wwwwb 的回复:
哦,你是用SELECT INTO OUTFILE
只能用LOAD DATA INIFILE才行,你在命令行下执行LOAD DATA INIFILE试试
正如我所说 先建立索引 设置 innodb_flush_log_at_trx_commit = 0; 然后执行导入:load data local infile 'XXX.txt' into table Insert_database fields terminated by '\t' lines terminated by '\r\n'
这个过程很慢 至少是从 10:12 到现在为止 一直 在执行 。。。(我在mysql 控制台也看不到进度!!)
然而 如果 我们不建立索引 设置 innodb_flush_log_at_trx_commit = 0; 然后执行导入:load data local infile 'XXX.txt' into table Insert_database fields terminated by '\t' lines terminated by '\r\n'
也就 三四分钟的事情 !!貌似 设不设置 innodb_flush_log_at_trx_commit 没有太大的 关系!!!
但是我知道如果先导入了 数据在建立 索引 这个过程很耗时!!!前面那种方式我知道是在 导入数据的时候就添加好索引!!!(但是第一种方式我也看不到 执行进度,在mysql 控制台黑屏 。。看不到 如果 用navicat 这个工具来 执行导入 貌似 不管执行哪种方式的导入 速度都很慢!!!)
顺便说一下我的目的吧。。我是想把 数据导入之后 做一个统计查询!!!就这样。。如果不建立索引 我知道
查询 速度很慢!!!但是建立索引 又是一个很耗时的过程 。。。有没有一种方式 不建立索引 也能提高查询和 统计的速度的。。。。
目前的统计语句是这样的。。。
第一个sql :统计总的 记录条数(用于分页)
select count(*) from (select rb.red_ball,count(1) from insert_database rb group by rb.red_ball having count(1)=1) as temp
第二个 sql:就是 查询语句 在分页上面使用
select rb.red_ball,count(1) from insert_database rb group by rb.red_ball having count(1)=1
limit x,x
还有一个导出 的:
select * from (select rb.red_ball,count(1) from insert_database rb group by rb.red_ball having count(1)=1) as temp into outfile 'xxx.txt' fields terminated by '\t' lines terminated by '\r\n'
又没办法实现不是建立索引能提高 查询和 统计速度的方式。。? 期待 大牛出现!
对我有用[0]丢个板砖[0]引用举报管理TOP
wfevgch
(聪明的一休)
等 级:
#32楼 得分:0回复于:2011-09-22 14:11:431 我不了解你表里的业务逻辑,red_ball是什么值,如果可以的话,是否能通过小表用编号维护red_ball,这样实际数据就可以编号,这样效率会提高很多,一般情况下,我们不应该在字符串上建索引,实在没办法,也只能用char类型,而不是varchar
2 关于innodb_flush_log_at_trx_commit,我不知道你的实际环境,你不妨做个实验,一个简单的循环insert百万数据量,innodb_flush_log_at_trx_commit不同的设置,执行时间上差别很大,是几十分钟和几十秒的区别
对我有用[0]丢个板砖[0]引用举报管理TOP
qinchende
(cd.NET)
等 级:
#33楼 得分:0回复于:2011-09-22 17:41:59不知道楼主用的MySQL版本如何?
我建议最好升级MySQL到最新的5.5.x,实践证明5.5.x在索引的处理上跟5.1.x 5.0.x比,那就是火箭跟乌龟的区别!!!
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#34楼 得分:0回复于:2011-09-22 17:49:58引用 33 楼 qinchende 的回复:
不知道楼主用的MySQL版本如何?
我建议最好升级MySQL到最新的5.5.x,实践证明5.5.x在索引的处理上跟5.1.x 5.0.x比,那就是火箭跟乌龟的区别!!!
好吧。。我下载个。。5.5试试 。。但是我之前安装5.5的时候。。貌似执行不了。truncate table table_name 的操作。。。
对我有用[0]丢个板砖[0]引用举报管理TOP
wIloverYou123456789
(wIloverYou123456789)
等 级:
#35楼 得分:0回复于:2011-09-22 17:53:08引用 32 楼 wfevgch 的回复:
1 我不了解你表里的业务逻辑,red_ball是什么值,如果可以的话,是否能通过小表用编号维护red_ball,这样实际数据就可以编号,这样效率会提高很多,一般情况下,我们不应该在字符串上建索引,实在没办法,也只能用char类型,而不是varchar
2 关于innodb_flush_log_at_trx_commit,我不知道你的实际环境,你不妨做个实验,一个简单的循环insert百万数……
我明白你的意思:
你第一条件建议 就是建议我按照 数据库范式 来做! 现在我的 red_ball 类型已经是char 了。。
关于第二条件建议 我还真没有使用 循环一个 insert 来做!!!因为我现在导入数据 是使用load data local infile 在mysql 控制台我也看不到速度!!! 只能通过navicat 这样的恐惧 来导入。。
通过相同的时间 来比较 文件导入的进度!!!
不过很感谢你的建议! 不知道有没有更好的办法。。比如像 33 楼所说。。。。
对我有用[0]丢个板砖[0]引用举报管理TOP
wfevgch
(聪明的一休)
等 级:
#36楼 得分:0回复于:2011-09-22 18:22:31关于innodb_flush_log_at_trx_commit的试验你不妨做一下(限麻烦的话,可以联系我给你测试代码)
因为innodb_flush_log_at_trx_commit的效果太明显,我也想知道你的环境到底有什么问题。
如果想用insert语句的话,你可以用mysqldump把表的insert语句导出来执行。
不过我个人觉得文件导入的话,最终也是应该生成insert语句,而且是支持批处理的,就是insert *** values (),(),()...;理论上效率应该更高。
引用 35 楼 wiloveryou123456789 的回复:
引用 32 楼 wfevgch 的回复:
1 我不了解你表里的业务逻辑,red_ball是什么值,如果可以的话,是否能通过小表用编号维护red_ball,这样实际数据就可以编号,这样效率会提高很多,一般情况下,我们不应该在字符串上建索引,实在没办法,也只能用char类型,而不是varchar
2 关于innodb_flush_log_at_trx_commit,我不知道你的实际环境,……
相关推荐
MySQL单表2000万数据查询慢解决方案1 本文主要讨论了如何解决MySQL单表2000万...通过本文,我们可以学习到如何使用分区和时间触发器来解决MySQL单表2000万数据查询慢的问题,并可以将这些技术要点应用到实际工作中。
本教程将探讨如何解决MySQL大数据量下LIKE查询慢的问题,并介绍一种JAVA模拟LIKE的方法来提升查询效率。 首先,我们需要理解LIKE查询的工作原理。当使用LIKE查询时,如果模式以%开头或结尾,MySQL无法利用索引来...
MySQL数据库是世界上最流行的开源关系型数据库管理系统之一,其高效的数据查询能力在很大程度上依赖于索引。本笔记将深入探讨MySQL中的索引使用,旨在帮助你提升数据库性能。 1. 索引的概念与类型: - 索引是一种...
2. **创建或调整索引**:根据Anemometer的建议,为经常出现在慢查询中的列添加索引,或者优化现有索引。 3. **调整MySQL配置**:根据分析结果调整MySQL的配置参数,比如增大缓冲池大小,优化查询缓存等。 4. **...
MySQL 索引数据结构是数据库管理系统中提升查询效率的关键技术。当我们在处理查询速度较慢的 SQL 语句时,通常会考虑引入索引来优化。索引是一种特殊的数据结构,它按照一定的排序规则存储了数据表中的部分或全部...
- 开启慢查询日志的方法有两种:一种是在MySQL配置文件`my.cnf`或`my.ini`中添加相关参数;另一种是通过命令行动态设置。 配置示例: ```ini [mysqld] log-slow-queries = /data/mysqldata/slow-query.log ...
合理地为查询涉及的字段创建索引可以大大提高查询速度。 2. **对字段进行函数操作** 在查询条件中对字段进行函数操作(如`DATE_FORMAT()`或`UPPER()`),会阻止MySQL使用索引,因为它无法直接比较索引值。尽量避免...
MySQL索引是数据库管理系统中用于加速数据检索的关键组件。它们的工作原理类似于书籍的索引,允许数据库系统快速定位和访问所需的数据,而无需遍历整个表。MySQL支持多种类型的索引,包括普通索引、唯一性索引和主键...
在选择索引列时,应尽量避免在具有高基数(即不同值很多)的列上创建索引,因为这会导致索引效率低下。 中篇的索引优化策略会深入到索引的维护和管理,包括如何添加、删除和重构索引。这涉及到监控数据库性能,分析...
3. **大量磁盘I/O操作**:由于磁盘I/O操作是基于物理设备的操作,相较于CPU的处理速度要慢很多,因此大量的磁盘I/O会导致数据定位性能严重下降。 #### 三、磁盘I/O的构成 磁盘读取数据的过程涉及到寻道时间、旋转...
MySQL中的分页查询是Web应用中常见的操作,但随着数据量的增长,`LIMIT`语句在处理大量数据时性能会显著下降。特别是当`OFFSET`值增大时,MySQL需要扫描更多的行来找到需要的数据,这可能导致查询速度变慢,甚至对...
如果查询速度慢并且有很多锁定的查询,可能是由于资源限制或配置不当导致。检查MySQL的系统资源,如内存、CPU使用情况,以及`max_connections`等配置参数。 10. **优化查询**: 对于长时间执行的查询,考虑优化...
在MySQL中,可以使用`CREATE INDEX`或`ALTER TABLE`语句来创建索引。例如: ```sql CREATE INDEX idx_example ON table_name (column_name); ``` 主键自动创建索引,如: ```sql CREATE TABLE table_name ( id INT ...
标题中的“10倍以上提高Pentaho Kettle的MySQL写入速度”指的是通过优化Pentaho Kettle(也称为Kettle或PDI)的数据处理流程,显著提升了将数据导入到MySQL数据库的速度。Pentaho Kettle是一款强大的ETL(提取、转换...
在创建索引时,应选择查询中最常使用的列作为索引列。例如,如果一个查询经常涉及某个条件,那么这个条件对应的列就应该建立索引。 - **考虑复合索引** 复合索引是指在多个列上建立的索引。通过创建复合索引,...
1. **查询频率**:经常用于查询的列应优先创建索引。 2. **唯一性**:具有大量唯一值的列更适合建立索引,因为索引的效率与索引项的区分度密切相关。 3. **列的基数**:基数是指列中不同值的数量,基数越高,索引...
### MySQL慢查询详解 #### 一、什么是慢查询 慢查询是MySQL中一种重要的性能调试手段,主要用于记录那些执行时间过长的SQL语句。慢查询日志可以帮助我们找到那些性能不佳的SQL语句,从而对其进行优化。默认情况下...
在上述SQL示例中,工程师建议为每个字段创建单独的索引,但这是不必要的,甚至可能导致索引过度使用。实际上,一个针对所有条件的联合索引可能更为合适。在这种情况下,由于`operate_time`通常用于范围查询,应该...
2. MySQL Sending data 导致查询很慢 当查询涉及大量数据传输时,`Sending data`状态可能持续很长时间。这通常是因为没有有效的索引或查询优化。检查查询语句,确保正确使用了WHERE条件,并考虑添加合适的索引来加快...