Esses dias encontrei por acaso uma postagem sobre optmização de MySQL e as publico aqui por ter gostado da simplicidade e eficiencia.
Pesquisa por palavra exata
Muito rápido:
SELECT * FROM TABELA WHERE MATCH ('campo') AGAINST ('Palavra')
Rápido:
SELECT * FROM TABELA WHERE MATCH ('campo') AGAINST ('+Palavra' IN BOOLEAN MODE)
Lento:
SELECT * FROM TABELA WHERE campo RLIKE '(^| +)Palavra($| +)'
Lento:
SELECT * FROM TABELA WHERE campo RLIKE '([[:space:]]|[[:<:]])Palavra([[:space:]]|[[:>:]])'
Pesquisa por conteúdo
Muito rápido:
SELECT * FROM TABELA WHERE MATCH ('campo') AGAINST ('Palavra*' IN BOOLEAN MODE)
[sql]
Rápido:
[sql]
SELECT * FROM TABELA WHERE campo LIKE 'Palavra%'
Lento:
SELECT * FROM TABELA WHERE MATCH ('campo') AGAINST ('*Palavra*' IN BOOLEAN MODE)
Lento:
SELECT * FROM TABELA WHERE campo LIKE '%Palavra%'
Número de registros
Muito rápido:
SELECT SQL_CALC_FOUND_ROWS * FROM TABELA WHERE Condições LIMIT 0, 10 SELECT FOUND_ROWS()
Rápido:
SELECT * FROM TABELA WHERE Condições LIMIT 0, 10 SELECT COUNT(*) FROM TABELA WHERE Condições
Muito lento:
$result = mysql_query ( "SELECT * FROM TABELA", $link); $num_rows = mysql_num_rows ( $result);
Joins
Utilize INNER JOIN quando você deseja que a tabela unida possua apenas campos com registros que você expecificar no JOIN. Utilize LEFT JOIN quando não importar se os campos pesquisados possuem dados ou não.
SELECT * FROM produtos INNER JOIN fornecedores ON fornecedores.IDFornecedor = produtos.IDFornecedor
Retorna todos os produtos que possuem fornecedor.
SELECT * FROM produtos LEFT JOIN fornecedores ON fornecedores.IDFornecedor = produtos.IDFornecedor WHERE fornecedores.IDFornecedor IS NULL
Retorna todos os produtos que não possuam fornecedor.
Conclusão
Se depois de todas essas dicas você ainda não está satisfeito (pelo menos incentivei alguém!!! hehehe), recomendo uma lida na sessão de optimização do manual do MySQL, que explica muito bem como o MySQL age em cada situação. O manual pode ser encontrado aqui.



