作者gpmm (银色)
看板PHP
标题Re: [讨论] 太多OR条件的优化问题
时间Thu May 23 22:52:31 2013
※ 引述《azureshin (azureshin)》之铭言:
: 有一个array, 长度为500, 而里面的value都是要做为SQL条件的
: 所以我先用foreach解析array时, 就顺便组成字串规则如下
: $Str .= " SELECT * FROM test WHERE id > 1900039 name='".$value."' union all"
: 等foreach一结束, 我再统一执行指令
: 上面指令串起来可能是长这样
: SELECT * FROM test WHERE id > 1900039 and name='[email protected]' union all
: SELECT * FROM test WHERE id > 1900039 and name='[email protected]' union all
: SELECT * FROM test WHERE id > 1900039 and name='[email protected]'
可以先问一下为什麽要 union all 吗?
如果你抓的是同一个 table,可能有可以不用 union all 的方式,
把 union all 解掉,应该就有机会把速度拉上来。
: 我的问题有3个, 都是跟效能有关
: 1. 假设array长度为500, 原本程式就会是id > 1900039 and name= ? 执行500次, 但因
: 为id > 1900039是固定的
: 那我否把id > 1900039先捞出来, as tmp_table, 剩下的name = ? 要执行500次就从
: tmp_table去执行
: 这样效能感觉会比较好 ? 有这种写法吗 ?
有的,MySQL 可以建 Temporary table,
http://dev.mysql.com/doc/refman/5.1/en/create-table.html
: 还是mysql在执行500次的id > 1900039 and name= ?时, 底层就会自动把id > 1900039
: 放在memory来做缓冲 ? 不会重复读取资料表.
一般来说 DB 在你去拉 table 的时候,都会自动把用到的丢进记忆体里,
所以像在启动大量资料的资料库库时都会有个「热机」的动作,
藉由程式或一些方式让 table 先塞进记忆体里。
不过你想问的应该是会不会自动建临时表,
这个真的要 explain 一下才知道了…
: 2. 大家是怎处理OR条件很多的情形, 我知道有做index时, union all可以比OR有更好的
: 表现
: 但union all重复太多次时也是令人担心.....
union all 会比 or 有更好的表现应该是和「index 怎麽建」有关系,
MySQL 的 index(不好意思我只稍微知道 MySQL)是很复杂的东西,
如果你有空,我会推荐你看
http://www.percona.tv/percona-webinars/mysql-indexing-best-practices
: 上面方案1我不知道SQL怎写, 也没看过, 所以有想一个变通方式, 就是将id > 1900039读
: 出来丢进TEMPORARY TABLE
: 然後剩下的name= ? 不管重复几次就从TEMPORARY TABLE读取....
: 我自己还在不断尝试当中, 只是还没找到最佳解@@~~希望有人能一起讨论, 感谢
: --------------
: 第三个方法我自己刚测过, 更糟
: 就是将id > 1900039读出来, 然後用php去in_array判断name = ?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 1.172.166.252
1F:→ dlikeayu:我觉得要先请原po丢"运算值"来参考一下 05/24 22:20
2F:→ azureshin:运算值其实就是算距离的,cos那些,过阵子PO上来,感谢各位 05/25 17:12