mysql优化 - mysql 的 hint

 

FORCE INDEX 强制索引

只使用建立在field1上的索引,而不使用其它字段上的索引。

SELECT * FROM table1 FORCE INDEX (idx_field1)

 

IGNORE INDEX 忽略索引

table1 表中field1field2上的索引不被使用

SELECT * FROM table1 IGNORE INDEX (idx_field1, idx_field2)

 

SQL_NO_CACHE 不对结果集进行缓存,关闭查询缓冲

有一些SQL语句需要实时地查询数据,或者并不经常使用(可能一天就执行一两次),这样就需要把缓冲关了,不管这条SQL语句是否被执行过,服务器都不会在缓冲区中查找,每次都会执行它。

SELECT SQL_NO_CACHE table1.field1 FROM table1 AS table1 LIMIT 10

 

SQL_CACHE 强制查询缓冲

如果在my.ini中的query_cache_type设成2,这样只有在使用了SQL_CACHE后,才使用查询缓冲。

SELECT SQL_CALHE * FROM table1;

 

HIGH_PRIORITY 优先操作

HIGH_PRIORITY可以使用在selectinsert操作中,让MYSQL知道,这个操作优先进行。

SELECT HIGH_PRIORITY * FROM table1;

 

LOW_PRIORITY 滞后操作

LOW_PRIORITY可以使用在insertupdate操作中,让mysql知道,这个操作滞后。

update LOW_PRIORITY table1 set field1=1_new where field1=1

 

INSERT DELAYED 延时插入

INSERT DELAYED INTO,是客户端提交数据给MySQLMySQL返回OK状态给客户端。而这是并不是已经将数据插入表,而是存储在内存里面等待排队。当mysql有空余时,再插入。另一个重要的好处是,来自许多客户端的插入被集中在一起,并被编写入一个块。这比执行许多独立的插入要快很多。坏处是,不能返回自动递增的ID,以及系统崩溃时,MySQL还没有来得及插入数据的话,这些数据将会丢失。

INSERT DELAYED INTO table1 set field1=1

 

STRAIGHT_JOIN 强制连接顺序,SQL的关联顺序不要改变

SELECT table1.field1,table2.field2 FROM table1 AS table1 LEFT JOIN table2 AS table2 ON table1.id = table2.tb1_pkid LIMIT 100;

SELECT STRAIGHT_JOIN table1.field1,table2.field2 FROM table1 AS table1 LEFT JOIN table2 AS table2 ON table1.id = table2.tb1_pkid LIMIT 100;

 

SQL_BUFFER_RESULT 强制使用临时表

当我们查询的结果集中的数据比较多时,可以通过SQL_BUFFER_RESULT.选项强制将结果集放到临时表中,这样就可以很快地释放MySQL的表锁(这样其它的SQL语句就可以对这些记录进行查询了),并且可以长时间地为客户端提供大记录集。

SELECT SQL_BUFFER_RESULT * FROM field1 WHERE field1=1

 

SQL_BIG_RESULTSQL_SMALL_RESULT 分组使用临时表

一般用于分组或DISTINCT关键字,这个选项通知MySQL,如果有必要,就将查询结果放到临时表中,甚至在临时表中进行排序。SQL_SMALL_RESULT比起SQL_BIG_RESULT差不多,很少使用。

SELECT SQL_BUFFER_RESULT FIELD1, COUNT(*) FROM table1 GROUP BY field1;

 

posted on 2017-01-09 18:00  周~~  阅读(356)  评论(0编辑  收藏  举报

导航