请问这个mysql索引该如何优化

cg20 2018-09-25 03:11:51
有两个表分别为fproduct(产品表,有几万条记录)、comment(评论表,有几万条记录)
CREATE TABLE `fproduct` (
`f_id` INT(11) NOT NULL AUTO_INCREMENT,
`f_show` INT(11) DEFAULT '1', COMMENT '0不显示,1显示',
`f_date` BIGINT(20) DEFAULT '0',
PRIMARY KEY (`f_id`)
) ENGINE=INNODB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8


CREATE TABLE `comment` (
`c_id` INT(11) NOT NULL AUTO_INCREMENT,
`c_fid` INT(11) DEFAULT '0', COMMENT '对应产品表f_id',
`c_verify` INT(11) DEFAULT '0' COMMENT '0为未审核(不显示),1为审核(显示)',
`c_date` BIGINT(20) DEFAULT '0',
PRIMARY KEY (`c_id`)
) ENGINE=INNODB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8


被攻击,使用show processlist;发现下面这个查询语句被访问得非常多。
SELECT COUNT(f_id) FROM `comment`,fproduct WHERE c_fid=f_id AND c_verify=1 AND f_show=1 ORDER BY c_date DESC;

请问该如何创建索引才能使得查询最优化?
谢谢
...全文
203 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
木秀猿林 2018-09-26
  • 打赏
  • 举报
回复
你在f_show的列上建索引意义不大的,f_show的值只有0和1不建议创建索引。看你的sql查询只是查询总数,那你后面的order by排序可以不用加。如果性能还需要优化,可以考虑用视图查询出f_show,c_verify都为1的保存在视图中,然后从视图中统计。另外可以根据你查询的数据特点来查询,比如你查询评论只会查询当天的或者几天的可以使用where c_date = ' '语句来过滤。
下雨的声音丶 2018-09-25
  • 打赏
  • 举报
回复
f_date,c_date 这两个字段没必要用bigint用int就行了;f_show,c_verify这两个字段没必要用int用枚举试一试,把c_fid 加一个普通索引试一试
xuzuning 2018-09-25
  • 打赏
  • 举报
回复
EXPLAIN 的报告 是唯一的依据
当然是音响的行数越少越好
那还可以调换两表的次序,调换条件表达式的次序,将有索引的字段放在表达式的左边.....

如果你每个产品都必有评论的话,就没有必要分表处理了
cg20 2018-09-25
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
在 f_show 上建索引
最好从 EXPLAIN 的报告中获取意见

c_fid 和 f_id 分别是可独立操作的表的主键,关联在一起的意义何在?


因为要同时获取评论,以及对应的产品,所以用了c_fid=f_id
最开始EXPLAIN的结果为:

使用ALTER TABLE `fproduct` ADD INDEX index_fshow(f_show);

rows还更多了呢?变为28043了这里是越多越不好吧?
初次接触索引,很多不懂的请多谅解。
xuzuning 2018-09-25
  • 打赏
  • 举报
回复
在 f_show 上建索引
最好从 EXPLAIN 的报告中获取意见

c_fid 和 f_id 分别是可独立操作的表的主键,关联在一起的意义何在?

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧