我有一个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启动时,它将磁盘表加载到内存中。