8
回答
mysql的这两种执行方式,那个更加高效?
华为云实践训练营,热门技术免费实践!>>>   

第一种: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联合

哪种方法好呢?

举报
freedonn
发帖于3年前 8回/414阅
共有8个答案 最后回答: 3年前

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根本不能使用索引,结果是检索会很慢



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

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


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

要看数据量的大小和索引的情况,不然不好判定
--- 共有 2 条评论 ---
xialeistudio回复 @非良 : 你说的对,因为千万级数据连表的效率实在是。。况且第二种可以通过单记录缓存来优化 3年前 回复
微信时光侠同意.数据少的话第一种合适,数据多的话,第二种合适. 3年前 回复
顶部