全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

IP归属甄别会员请立即修改密码
查看: 3438|回复: 27
打印 上一主题 下一主题

懂MYSQL的进来,索引的问题

[复制链接]
跳转到指定楼层
1#
发表于 2013-12-13 09:13:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
total = $db->fetchOne("SELECT count(doye) FROM `members`");
smarty->assign("total", $total);

这是程序的调用语句

每次打开网站,就执行一次上面的命令,每次打开统计一次,网站会员十几万,MYSQL吃CPU非常的厉害

有什么办法可以降低CPU的占用吗?

在网上搜索了一下,索引,就是为DOYE这个字段建立一个索引

问题出来了,建立索引后程序的调用语句是否需要更改

网上看到的建立索引的命令
CREATE INDEX ind_accountcode ON callhistory (accountcode);
我的应该是不是就应该这样写
CREATE INDEX ind total ON members (doye);
这条命令在MYSQL执行一次就可以了,还是要如何弄,求高手解答。
另外优化MYSQL还有什么比较好的建议吗?




2#
发表于 2013-12-13 09:19:37 | 只看该作者
本帖最后由 leassy 于 2013-12-13 09:20 编辑

ALTER TABLE `members` ADD INDEX `index_doye` (`doye`);
执行这个就好
3#
 楼主| 发表于 2013-12-13 09:22:49 | 只看该作者
leassy 发表于 2013-12-13 09:19
ALTER TABLE `members` ADD INDEX `index_doye` (`doye`);
执行这个就好

这条命令是建立索引吗?
4#
发表于 2013-12-13 09:24:58 | 只看该作者
soey 发表于 2013-12-13 09:22
这条命令是建立索引吗?

5#
 楼主| 发表于 2013-12-13 09:25:51 | 只看该作者

程序中调用不变吗?
6#
发表于 2013-12-13 09:30:27 | 只看该作者
具体要同用explain 查看索引加哪上

"SELECT count(doye) FROM `members`"
"SELECT count(*) FROM `members`"
"SELECT count(1) FROM `members`"
"SELECT count(2) FROM `members`"

他们的效果都是一样的,那么多字段,你确定索引就加在 doye 上?
7#
 楼主| 发表于 2013-12-13 09:36:14 | 只看该作者
ohmyga 发表于 2013-12-13 09:30
具体要同用explain 查看索引加哪上

"SELECT count(doye) FROM `members`"

其实我是想这样的
在数据库A中,有一个表MEMBERS,MEMBERS中有一个字段doye
上面是程序调用语句在PHP中你也看到了,这个语句,每有一个人打开网站,就执行一次,网站会员接近15万,每次打开执行一次那一个求和,15万每次耗费大量的CPU
就是想优化一下,或者加个命令,让PHP中执行的这个多长时间执行一次或者建立索引
8#
发表于 2013-12-13 09:46:36 | 只看该作者
soey 发表于 2013-12-13 09:25
程序中调用不变吗?

不用变
9#
发表于 2013-12-13 09:50:03 | 只看该作者
我认为这个语句不会耗费CPU 。
首先:
像count 语句本身就是高效的。如Discuz X3 会员表有70W记录 在一台普通PC上 速度是0.02xs左右,所以该语句不会成为瓶颈。

其次:如果使用myisam引擎 该语句还会保存记录的总数,直接返回结果,无需每次遍历,而不会像innodb一样还需要全表扫描一次。

你可以在phpmyadmin中执行  EXPLAIN SELECT count(doye) FROM `members`

如果Extra自动 出现 Select tables optimized away 完全没必要组任何东西。

1.png (8.17 KB, 下载次数: 2)

而且就是个计算总数而已,打不了用php写个缓存啦。。
10#
发表于 2013-12-13 09:50:29 | 只看该作者
你的表引擎是什么,如果是MYISAM,那么不用加索引直接count都会很快
如果表引擎是InooDB,那么没什么好的办法,只能建议你count主键了,这个主键一般都是ID列吧


你试试 SELECT count(`id`) FROM `members`

这个id是你的主键字段,你看看你表中主键是哪个,就写上
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2026-1-15 03:55 , Processed in 0.072840 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表