还是上次那个问题(ACMAIN_CHM wwwwA, wwwwb等请进)
这个帖子中我一直强调的大数据量和小数据量的问题其实是个误导!
并不是因为数据量,而是某个索引没有起作用,导致了全表扫描!应该是这样,我不是百分百确定!
现在,删除了几个不必要的索引,把问题集中锁定在如下语句:
EXPLAIN SELECT SQL_NO_CACHE E_info.infoID, E_info.info_time, E_role_info.roleID, E_role_info.related FROM `E_info` LEFT JOIN E_role_info ON E_info.infoID = E_role_info.infoID WHERE E_role_info.roleID = 25669 ORDER BY E_info.infoID DESC LIMIT 1;
+----+-------------+-------------+-------+---------------+---------+---------+-------------------------+---------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------+-------+---------------+---------+---------+-------------------------+---------+-------------+
| 1 | SIMPLE | E_info | index | PRIMARY | PRIMARY | 4 | NULL | 7300143 | |
| 1 | SIMPLE | E_role_info | ref | infoID | infoID | 4 | news_data.E_info.infoID | 7 | Using where |
+----+-------------+-------------+-------+---------------+---------+---------+-------------------------+---------+-------------+
E_info.infoID是主键,而且上边E_info的type项已经是index了,但不清楚为什么rows项的数值还是那么大,7300143 这个数字也恰恰是E_info的行数!
mysql> SELECT SQL_NO_CACHE COUNT(*) FROM E_info;
+----------+
| COUNT(*) |
+----------+
| 7300143 |
+----------+
所用的存储引擎是MyISAM,索引文件E_info.MYI是100M大小,我怀疑是索引太大,内存撑不下,老得访问磁盘所致,故而将key_buffer_size增加到512,可依然很慢,查第一条记录要18秒。
mysql>SELECT SQL_NO_CACHE E_info.infoID, E_info.info_time, E_role_info.roleID, E_role_info.related FROM `E_info` LEFT JOIN E_role_info ON E_info.infoID = E_role_info.infoID WHERE E_role_info.roleID = 25669 ORDER BY E_info.infoID DESC LIMIT 1;
+----------+---------------------+--------+---------+
| infoID | info_time | roleID | related |
+----------+---------------------+--------+---------+
| 42570652 | 2009-04-14 13:27:45 | 25669 | 1001 |
+----------+---------------------+--------+---------+
1 row in set (18.89 sec)
再描述一下E_role_info表,
mysql> show columns from E_role_info;
+---------+-----------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-----------------------+------+-----+---------+-------+
| infoID | int(8) unsigned | NO | MUL | 0 | |
| roleID | mediumint(6) unsigned | NO | | 0 | |
| related | smallint(3) unsigned | NO | | 0 | |
+---------+-----------------------+------+-----+---------+-------+
我在该表中插入一条记录
INSERT INTO E_role_info(infoID, roleID, related) values(42880361, 25669, 1);
这时很快就列出了刚刚记录的结果:
mysql> SELECT SQL_NO_CACHE E_info.infoID, E_info.info_time, E_role_info.roleID, E_role_info.related FROM `E_info` INNER JOIN E_role_info ON E_info.infoID = E_role_info.infoID WHERE E_role_info.roleID = 25669 ORDER BY E_info.infoID DESC LIMIT 1;
+----------+---------------------+--------+---------+
| infoID | info_time | roleID | related |
+----------+---------------------+--------+---------+
| 42880361 | 2009-04-18 08:58:28 | 25669 | 1 |
+----------+---------------------+--------+---------+
1 row in set (0.00 sec)
但,如果列出两条的话,就会由于以前数据的拖累,而很慢:
SELECT SQL_NO_CACHE E_info.infoID, E_info.info_time, E_role_info.roleID, E_role_info.related FROM `E_info` INNER JOIN E_role_info ON E_info.infoID = E_role_info.infoID WHERE E_role_info.roleID = 25669 ORDER BY E_info.infoID DESC LIMIT 2;
+----------+---------------------+--------+---------+
| infoID | info_time | roleID | related |
+----------+---------------------+--------+---------+
| 42880361 | 2009-04-18 08:58:28 | 25669 | 1 |
| 42570652 | 2009-04-14 13:27:45 | 25669 | 1001 |
+----------+---------------------+--------+---------+
2 rows in set (17.78 sec)
通过结果可以看出,两次列出的值中42880361比42570652要新!
所以,我估计是由于某种原因E_info的主键没有用上,即便explain的type值显示的是index.
extra中没有using filesort说明应该不是ORDER BY的问题,很可能是JOIN阶段的问题:
`E_info` LEFT JOIN E_role_info ON E_info.infoID = E_role_info.infoID
E_info.infoID是本表的主键,E_role_info.infoID也建立了索引!
相关推荐
公司宿舍管理系统&ACCESS源码
这是我最近做的偶公司的宿舍管理系统。第一次做这么完整的。 在这里上传资源,一方面给像我一样的初学者一个例子。而更重要的想通过这个方式表达我对“虞山飘渺峰”和“ACMAIN_CHM”的感谢,因为在做这个的过程中,他们给我很大帮助,尤其是“虞山缥缈峰”,不仅给了我耐心的指导,而且对我的一些数据表做了重新设计。非常感谢二位! 同时也非常感谢CSDN给了大家一个非常好的学习环境!
Offic对象模型大全.part1(CHM)
如果你要用VB或VBA操作OFFICE系统列软件,这个东西一定要是必备的。是我从office2003文档中找出来的!暂缺FrontPage,因为我没有装这个。而且估计很少有人用FrontPage的VBA吧。Offic对象模型大全├─Word 对象模型│ VBAWD10.CHM│├─Access 对象模型│ ACMAIN11.CHM│ VBAAC10.CHM│├─Excel 对象模型│ VBAXL10.CHM│├─Graph 对象│ VBAGR10.CHM│├─Office 对象模型│ VBAOF11.CHM│├─Outlook 对象模型│ VBAOL11.CHM│├─PowerPoint 对象模型│ VBAPP10.CHM│├─Publisher 对象模型映射│ VBAPB10.CHM│└─FrontPage 对象模型(暂无)
Offic对象模型大全.part2(CHM)
如果你要用VB或VBA操作OFFICE系统列软件,这个东西一定要是必备的。是我从office2003文档中找出来的!<br>暂缺FrontPage,因为我没有装这个。而且估计很少有人用FrontPage的VBA吧。<br><br>Offic对象模型大全<br>├─Word 对象模型<br>│ VBAWD10.CHM<br>│<br>├─Access 对象模型<br>│ ACMAIN11.CHM<br>│ VBAAC10.CHM<br>│<br>├─Excel 对象模型<br>│ VBAXL10.CHM<br>│<br>├─Graph 对象<br>│ VBAGR10.CHM<br>│<br>├─Office 对象模型<br>│ VBAOF11.CHM<br>│<br>├─Outlook 对象模型<br>│ VBAOL11.CHM<br>│<br>├─PowerPoint 对象模型<br>│ VBAPP10.CHM<br>│<br>├─Publisher 对象模型映射<br>│ VBAPB10.CHM<br>│<br>└─FrontPage 对象模型(暂无)
Offic对象模型大全.part3(CHM)
如果你要用VB或VBA操作OFFICE系统列软件,这个东西一定要是必备的。是我从office2003文档中找出来的!<br>暂缺FrontPage,因为我没有装这个。而且估计很少有人用FrontPage的VBA吧。<br><br>Offic对象模型大全<br>├─Word 对象模型<br>│ VBAWD10.CHM<br>│<br>├─Access 对象模型<br>│ ACMAIN11.CHM<br>│ VBAAC10.CHM<br>│<br>├─Excel 对象模型<br>│ VBAXL10.CHM<br>│<br>├─Graph 对象<br>│ VBAGR10.CHM<br>│<br>├─Office 对象模型<br>│ VBAOF11.CHM<br>│<br>├─Outlook 对象模型<br>│ VBAOL11.CHM<br>│<br>├─PowerPoint 对象模型<br>│ VBAPP10.CHM<br>│<br>├─Publisher 对象模型映射<br>│ VBAPB10.CHM<br>│<br>└─FrontPage 对象模型(暂无)
case乱码解决
mysql 中case when 遇到乱码解决。查询语句中含有case引起中文乱码解决方法



