mysql 查询优化

来源:互联网 发布:刻录软件找不到文件 编辑:程序博客网 时间:2024/05/29 03:50

1、一个sql查询语句是否可以使用一个表的多个索引?

否,对于一个表你可以自由创建索引,没有数量限制,但是使用索引过多会影响数据的更新操作,如Update和delete等等,但是查询的时候,一个表只能使用一个索引,如果Mysql发现你的查询语句中使用了多个索引它会通过内部的优化器优化你的SQL语句,只使用其中一个最优的索引。

2、关于组合索引与单独索引

组合索引是指一个索引中包含两个字段例如:  

ALTER TABLE AUTHZ_USER_PARKING_GROUP ADDINDEXIDX_PARKING_GROUP_ID_USER_ID (PARKING_GROUP_ID,USER_ID)

这个索引可以分解为两个单独的索引

PARKING_GROUP_ID,USER_ID

PARKING_GROUP_ID

当一个查询语句同时使用到 PARKING_GROUP_ID,USER_ID 这两个字段时,查询效率工会高很多,而单独创建两个索引时,只有一个索引会被用到,或者需要在两个索引中跳来跳去,更加影响性能。所以当一个表中多个字段要用到时间,要考虑创建组合索引,另外组合的字段的顺序也很重要。

3、mysql 语句like contact('%','','%')不会使用索引,如果为相应的字段建立索引也是徒劳。而前匹配like contact('','','%')则会使用索引,注意如何表字段为int类型时是不会使用索引的,对于int类型要使用等于。


4、强制使用某个索引

当一个表中有多个字段用到查询条件中,由于存在多个索引或者查询条件过于复杂时,可能一个索引都不会使用到,这时候我们要强制指定一个索引。例如:

SELECT
pb.USER_TYPE,pb.CAR_CODE,pb.SHOULD_CHARGE_VALUE,pb.ACT_CHARGE_VALUE,

pb.ACT_CRASH_VALUE,
pb.TRADER_RELIEF_VALUE,pb.PARK_RELIEF_VALUE,pb.PLATFORM_RELIEF_VALUE,pb.OWE_MONEY,
pb.TOP_BILL_CODE,pb.CHECK_IN_TIME,pb.CHECK_OUT_TIME,pb.LAST_UPDATE_TIME 
FROM PARKING_BILL pb FORCE INDEX (PRIMARY)

5、如果有group by 或者 order by 最好以这个排序或者分组的字段作为索引。

6、时间日期使用索引时比较特殊

时间和日期必须在某一个范围内 才会使用索引 反之默认为不使用索引







0 0
原创粉丝点击