加速数据库访问
增强数据约束性(UNIQUE, FORREIGN KEY)
BTREE
HASH
FULLTEXT
SELECT * FROM EMPLOYEES WHERE LAST_NAME=“Smith”
SELECT * FROM EMPLOYEES WHERE LAST_NAME=“Smith” AND DEPT=“Accounting”
使用 索引 (LAST_NAME, DEPT)index(A, B, C)
可用索引的查询
总结: 在使用复合索引时,当碰上范围查询(<.>,BETWEEN), 使用IN不受影响
SELECT * FROM PLAYERS ORDER BY SCORE DESC LIMIT 10
SELECT * FROM PLAYERS WHERE COUNTRY=“US”ORDER BY SCORE DESC LIMIT 10
KEY(A, B)
使用索引的情况:
规则:
- 两列排序方向必须一致
- ORDER BY 之外的列必须使用等于条件,不可以用IN
覆盖索引: 并不是一种索引,而是直接从索引中返回查询数据,无需从表中获取。 SELECT STATUS FROM ORDERS WHERE CUSTOMER_ID=123
– KEY(CUSTOMER_ID,STATUS)
再聚合函数 min,max,group 中,可以对聚合的字段进行索引
MySQL的关联查询是嵌套循环的方式查找数据的。对Join的字段进行索引能极大地提高查询效率。
仅需在被查询的表上对应的字段建立索引
mysql可以在一次查询中使用多个索引,这就是索引合并(index merge), 此时使用联合索引会更好
使用前缀索引只是对BOLB/TEXT字段的部分数据建立索引,会减少索引的体积,但是不能作为覆盖索引使用 ALTER TABLE TITLE ADD KEY(TITLE(20));
注意前缀索引的索引长度的问题,选择唯一性最大的长度。
select count(distinct(title)) total,
count(distinct(left(title,10))) p10,
count(distinct(left(title,20))) p20 from title;
Cardinality
,该值由 ANALYZE TABLE 更新Explain 可以查看MySQL如何计划执行该SQL
- type: 从好到坏排序 system,const,eq_ref, ref, range, index, ALL
- rows: 大概需要扫描的行数,数量越大意味着查询更慢
- key-len: 显示有多少key被使用
- Extra: Using Index 使用索引,Using Filesort 使用排序, Using Temporary 使用临时表
SELECT * FROM TBL WHERE A=5 AND B=6
SELECT * FROM TBL WHERE A>5 AND B=6
根据以上两个查询,使用KEY(B,A) 的索引更好
不要对无性能问题的查询添加索引
过多的索引不仅占用空间,而且影响速度
KEY(A, B) SELECT * FROM TBL WHERE A BETWEEN 2 AND 4 AND B=5
会使用索引 SELECT * FROM TBL WHERE A IN (2,3,4) AND B=5
不会使用索引
KEY(GENDER,CITY) SELECT * FROM PEOPLE WHERE CITY=“NEW YORK”
不会使用索引 SELECT * FROM PEOPLE WHERE GENDER IN ("M","F") AND CITY=“NEW YORK”
可使用索引
技巧:在低选择性的列中可以这样使用,比如性别(gender),状态(status),布尔值等
KEY(A,B) SELECT * FROM TBL WHERE A IN (1,2) ORDER BY B LIMIT 5
不会用到索引 (SELECT * FROM TBL WHERE A=1 ORDER BY B LIMIT 5) UNION ALL (SELECT * FROM TBL WHERE A=2 ORDER BY B LIMIT 5) ORDER BY B LIMIT 5;
会在排序中用到索引,仅需对联合的结果做排序