MySQL数据库真的很慢,一个真正的大桌子

我有一个1.5亿行的MySQL表。 以下是它的数据结构。

在这里输入图像说明

以下是它的一些数据。

在这里输入图像说明

现在,使用PHP我的pipe理员我跑了下面的命令。

SELECT `iwords` FROM `wordstable` WHERE `iwebs` = "a1" 

它说,运行查询花费的时间不到一秒钟。 以下是certificate。

在这里输入图像说明

但实际上,这需要大约1分钟来显示我的数据!

所以我运行了一个Java代码来查看时间。 在下面。

 public void select(String str) { try { long startTime = System.currentTimeMillis(); Statement s = con.createStatement(); ResultSet executeQuery = s.executeQuery("SELECT `iwords` FROM `wordstable` WHERE `iwebs` = \"a1\" "); int r=0; long endTime = System.currentTimeMillis(); System.out.println("Time took by Database: "+(endTime-startTime)); while(executeQuery.next()) { r++; } System.out.println("Number of rows: "+String.valueOf(r)); } catch (SQLException ex) { ex.printStackTrace(); } } 

此代码打印时间为88779毫秒,即88.779秒!

这是一个非常大的问题,我有一系列的search词汇,如果search一个“单个”单词需要88秒,那么这将是无用的!

以下是我的一些高级表详细信息。

在这里输入图像说明

以下是有关服务器机器的详细信息

在这里输入图像说明

所以我的问题是,MySQL真的可以做这个工作吗? 根据MySQL,操作查询所花的时间更less,但为什么需要这么多时间才能实现? 我未来的数据库将比这更大,数十亿logging。 我需要在2-3秒内完成这个操作!

更新

按照SO成员的要求,我运行了下面的命令,并发布了他们的结果。

input EXPLAIN SELECT iwords FROM wordstable WHERE iwebs ='a1';

结果 在这里输入图像说明

input

 SET profiling=1; SELECT iwords FROM wordstable WHERE iwebs = 'a1'; SHOW profile; 

产量

在这里输入图像说明

最后,我正在使用远程桌面访问这个服务器,但是所有的代码和一切都在服务器内运行。

你在桌上有没有索引?

请张贴以下的输出:

 EXPLAIN SELECT iwords FROM wordstable WHERE iwebs = 'a1'; 

然后发布以下一组命令的输出:

 SET profiling=1; SELECT iwords FROM wordstable WHERE iwebs = 'a1'; SHOW profile; 

这将告诉你MySQL在哪里挂起,然后你至less知道从哪里开始。

更新:

看完你的更新后的问题,我不知道为什么MySQL找不到合适的键来运行你的查询。 “iwebs”可以包含多less个值? 您的持续时间显然是从caching中取得的。 你应该重置MySQL查询caching通过

 RESET QUERY CACHE; 

如果你有重新加载的权利,否则你应该使用

 FLUSH QUERY CACHE; 

如果你不能执行这个命令,你将不得不重新启动你的MySQL服务器实例。

像Nebu说的那样,用SQL_NO_CACHE标志重新运行你的命令,只是为了确保它不会妨碍你的进行。

所以:

 EXPLAIN SELECT SQL_NO_CACHE iwords FROM wordstable WHERE iwebs = 'a1'; SET profiling=1; SELECT SQL_NO_CACHE iwords FROM wordstable WHERE iwebs = 'a1'; SHOW profile; 

在认为查询被caching。 尝试

 SELECT SQL_NO_CACHE iwords FROM wordstable WHERE iwebs = 'a1'; 

这将更好地显示执行查询需要多长时间。 还要确保iwebs被索引。 最后加速查询将表存储在内存中:

CREATE TABLE ii_table (….)ENGINE = MEMORY DEFAULT CHARSET = utf8

将表存储在内存中确实有一些影响。 例如,每当mysql服务器停止时,表信息就消失了。 对于这种情况我个人创build两个表。 一个执行查询的内存表和一个磁盘表。 当mysql启动时,它将磁盘表加载到内存中。