作者TeemingVoid (TeemingVoid)
看板Database
标题Re: [SQL ] mysql执行效率问题
时间Fri Dec 30 19:00:12 2011
※ 引述《RedMapleWing (闇夜 枫)》之铭言:
: 我有一段sql码是这样
: SELECT a . * , b . * , c . *
: FROM comp_main AS a, comp_contact AS b, comp_index AS c
: WHERE a.briefIntro LIKE '%led%'
: AND b.main_sn = a.sn
: AND a.sn = c.comp
: AND (
: c.rank = '3'
: OR c.rank = '4'
: )
: ORDER BY c.rank ASC
: LIMIT 0 , 10
: ...
: 本来在公司网站内部资料不多的时候捞都没什麽问题
: 但近日新增了近2万笔资料进去
: ...
: 实测後发现是这段程式码喂给mysql後需要的执行时间非常的久
针对您的 SQL 叙述,我有以下建议,提供给您参考: :)
1. 利用 EXPLAIN 看看 MySQL 的执行计画,例如:
mysql> EXPLAIN SELECT * FROM ... \G
请特别留意 type, possible_keys, key 这三项的内容,检讨索引的使用情况。
2. 阅读您的 SQL 叙述时,我第一个留意到的是 a.briefIntro LIKE '%led%'。
在 %关键字% 的搜寻方式下,任何 SQL-based 的伺服器都将无可避免地必须进行
Table Scan(也就是每一笔全部找一遍),而且,您的 where 条件中,除了 join
条件式之外,没有任何的条件式可以帮忙缩小范围,因此,我推测 MySQL 真的只能
一笔接着一笔从头找到尾了,而你的资料量又已达一定程度,於是....
所以,我的建议是: 看看能不能针对 comp_main 那个资料表加上另一个条件,协
助缩小范围。
3. 编制全文检索索引。针对 briefIntro 栏位进行全文检索,协助进行
LIKE '%led%' 搜寻。不过,有个前提:你 Table 的 Engine 必须使用 MyISAM。
编制全文检索索引的语法示范:
CREATE TABLE comp_main (..., briefIntro CHAR(40),
FULLTEXT (briefIntro))
engine = MyISAM;
-- 或者
ALTER TABLE comp_main ADD FULLTEXT ft_briefIntro (briefIntro);
-- 或者
CREATE FULLTEXT INDEX ft_briefIntro comp_main (briefIntro);
编好之後,查询资料的语法:
SELECT * FROM comp_main WHERE MATCH(briefIntro) AGAINST('led');
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.41.96.244
1F:推 RedMapleWing:非常感谢你 12/31 17:43