mysql 优化查询语句_mysql 语句优化查询

作者分享了在MySQL 5.0环境下,通过添加索引来解决复杂SQL查询(涉及子查询)导致的网页响应延迟问题。策略包括在filename字段上建索引,以及在Policyreadinfo表中添加policyinfo_id字段并建立索引,最终大幅提升了查询速度。
摘要由CSDN通过智能技术生成

我用的是mysql5.0,

我程序中用到了一句sql是

SQL code

select count(DISTINCT id) from Policyinfo p where p.filename not in

(select p2.filename from Policyreadinfo p2 where p2.reader='test')

但是每次在程序中每次执行这句sql时网页就特慢,要10多秒,而这2个表的记录行数也就1000多而已,我把这句sql单独拿到SQLyog Enterprise里执行也很慢,和网页的执行时间差不多。我想在policyreadinfo表里建个索引,但是每次我执行建立索引的sql时,MYSQL就会停掉,建不了索引。

我用的到的结果如下:

"id", "select_type", "table","type","possible_keys","key","key_len","ref","rows","Extra"

"1", "PRIMARY", "p", "ALL", \N, \N, \N, \N, "1715","Using where"

"2", "DEPENDENT SUBQUERY","p2", "ALL", \N, \N, \N, \N, "4196","Using where"

其中表Policyinfo结构为

SQL code

CREATE TABLE `policyinfo` (

`id` int(11) NOT NULL auto_increment,

`filenum` varchar(50) default NULL,

`filename` varchar(100) default NULL,

`filecontent` longtext,

`writetime` datetime default NULL,

`writer` varchar(100) default NULL

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Policyreadinfo 表的结构是

SQL code

CREATE TABLE `policyreadinfo` (

`id` int(11) NOT NULL auto_increment,

`filename` varchar(500) default NULL,

`reader` varchar(100) default NULL,

`readtime` datetime default NULL,

PRIMARY KEY (`id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

这是我在论坛上提出的问题。源文链接:http://topic.csdn.net/u/20100325/10/801d54f6-121b-4431-873d-e061dc60c6a6.html

后来经过我的测试,终于早到解决办法啦。在2个表filename上分别建立索引。之前也有想过这个办法,但是不知道为什么一执行建立索引的SQL,MYSQL就会死掉。所以后来就没有尝试这种方法啦。

后来在本机测试发现建立索引后的查询速度是建立前的N倍。

于是就修改policyreadinfo在他这里加一个policyinfo_id 的字段保存policyinfo的id字段。然后再在policyinfo_id上建立索引。问题终于解决了。呵呵

总的优化SQL语句是

-- 增加Id 字段

ALTER TABLE policyreadinfo ADD `policyinfo_id` int(11);

-- 更新policyreadinfo 表,有些字段为null是因为他把政策名字改了

update policy

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值