mysql的这两种执行方式,那个更加高效?

freedonn 发布于 2015/03/18 15:14
阅读 432
收藏 0

第一种:select a.login_time,a.mode,a.mac,a.agent,s.shopname,ag.name from authlist a inner join shop s on a.shopid=s.id inner join agent ag on s.pid=ag.id  order by a.login_time desc limit 0,30

第二种是单独查询三个表,在程序里面用foreach联合

哪种方法好呢?

加载中
1
Tuesday
Tuesday

第一种考验的是mysql的承受算法能力.

第二种考验的是你的承受算法能力.

0
0-1
0-1

sql语句前加"explain "

table:显示这一行的数据是关于哪张表的

type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL

possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句

key: 实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引

key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好

ref:显示索引的哪一列被使用了,如果可能的话,是一个常数

rows:MYSQL认为必须检查的用来返回请求数据的行数

Extra:关于MYSQL如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是Using temporary和Using filesort,意思MYSQL根本不能使用索引,结果是检索会很慢



0
szf
szf

肯定是第一种,到时遇到问题,就是处理“查询优化问题”或更坏的“调整表设计更利于优化器工作”的两个问题。

这两个问题处理过程的经验,对个人对项目都是有好处的。


反观第二点方法,漏洞百出,比如表数据量多时怎么办?foreach循环成为瓶颈时怎么优化?你自己是否非常擅长的排序之类的算法? 这种经验什么时候再用得上?最重要一点,还有事务问题,要确保三句select在同一个事务中,这真是找麻烦啊。

0
xialeistudio
xialeistudio
要看数据量的大小和索引的情况,不然不好判定
xialeistudio
xialeistudio
回复 @非良 : 你说的对,因为千万级数据连表的效率实在是。。况且第二种可以通过单记录缓存来优化
wx---羊毛联盟
wx---羊毛联盟
同意.数据少的话第一种合适,数据多的话,第二种合适.
0
酒逍遥
酒逍遥
具体问题具体分析.....根据你提供的信息来看..显然第一种更好
0
杨少_winston
杨少_winston
第一种,能一次查库就一次查库,可以通过优化SQL语句建索引来提高查询性能
0
ericsoul
ericsoul
根据 foreach 这个函数来看,如果是php的话,我觉得 mysql虽然不济,也应该可以优化到比php foreach快
0
l
loverCWS
 缓存真是好东西,有了缓存就有不同的方案。
freedonn
freedonn
举个例子吧
返回顶部
顶部