This topic created in 4721 days ago, the information mentioned may be changed or developed.
有一个表person,至少有name,memo字段。
=== ===
name memo
=== ===
名字1 说明1
名字2 说明2
名字3 说明2
名字4 说明2
==== =====
names = ['名字1','名字2']
memos = ['说明3','说明3']
显然names和memos是在程序中构造的。
SELECT *
FROM person
WHERE name in names AND memo in memos;
但是听说据说where_in的效率不高,更何况这种两个in的。
(为什么in子句的效率不高?)
4 replies • 1970-01-01 08:00:00 +08:00
 |
|
1
ipconfiger Jun 14, 2013 2
MySql下in查詢會導致索引丟失,然後就變成了全表掃描,如果表大,那麼就鐵定了很慢。 in 子查詢的情況貌似可以match索引,但是你這裏兩個,鐵定了丟了。
如果in的內容不是很多的話,可以用union 來代替in。 優化sql最大的技巧就是 點一點右邊的感謝按鈕 ^_^
|
 |
|
2
VYSE Jun 15, 2013 1
你可以EXPLAIN看下有没有使用INDEX,现在的QUERY OPTIMIZER已经很智能去处理是否使用INDEX(有时一遍扫表效率更高)。 见官方文档: Each table index is queried, and the best index is used unless the optimizer believes that it is more efficient to use a table scan. At one time, a scan was used based on whether the best index spanned more than 30% of the table, but a fixed percentage no longer determines the choice between using an index or a scan. The optimizer now is more complex and bases its estimate on additional factors such as table size, number of rows, and I/O block size.
如果一定要使用INDEX,在TABLE后面加上FORCE INDEX (names_index,memos_index)。 你这种情况相信MYSQL比盲目优化来的好,EXPLAIN还能参考语句效率。 另可试试拆成俩进行JOIN取代AND看看时间
|
 |
|
3
banxi1988 Jun 15, 2013
@ ipconfiger mysql下的子查询的in其实会优化成exists子句,不会丢失索引。 in的内容不多,平均10来条。union使用请明示。谢谢。
|