先简单叙述
一、mysql查询优化
数据库有10万条数据,取出最新的10条 ,怎么做?
1.给createtime字段建立索引,然后order by 一下,如果where子句使用了索引,order by使用索引无效。
原话:Mysql在查询的时候只会使用一个索引,因此如果where子句已经使用了索引的话,那么order by中的列是不会使用索引的,
所以order by尽量不要包含多个列的排序,如果非要多列排序,最好使用组合索引。
二、建索引和不建索引区别,比较
1.无索引情况:
注:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL ,
一般来说,得保证查询至少达到range级别,最好能达到ref。
explain查询sql执行计划,各列含义:
table:表名;
type:连接的类型
-const:主键、索引;
-eq_reg:主键、索引的范围查找;
-ref:连接的查找(join)
-range:索引的范围查找;
-index:索引的扫描;
-all:全表扫描;
possible_keys:可能用到的索引;
key:实际使用的索引;
key_len:索引的长度,越短越好;
ref:索引的哪一列被使用了,常数较好;
rows:mysql认为必须检查的用来返回请求数据的行数;
extra:using filesort、using temporary(常出现在使用order by时)时需要优化。
-Using filesort 额外排序。看到这个的时候,查询就需要优化了
-Using temporary 使用了临时表。看到这个的时候,也需要优化
(3)PROFILING分析SQL语句explain解释地址:http://blog.csdn.net/zhuxineli/article/details/14455029
![]()
2.有索引的情况
![]()
二、有时建立索引的弊端
1.索引对于数据库是非常重要的。在查询时可以通过索引来提高性能。但有时使用索引反而会降低性能
对于需要搜索的数据占表总体数据的50%或者更多的时候,使用索引反而会更慢。
例子:
CREATE TABLE SALES ( ID INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, NAME VARCHAR(100) NOT NULL, PRICE FLOAT NOT NULL,SALE_COUNT INT NOT NULL, SALE_DATE DATE NOT NULL, PRIMARY KEY(ID), INDEX (NAME), INDEX (SALE_DATE) );
假设这个表中保存了数百万条数据,而我们要查询商品号为1000的商品在2004年和2005年的平均价格。我们可以写如下的SQL语句:
代码:
SELECT AVG(PRICE) FROM SALES WHERE
SALE_DATE BETWEEN '2014-1-1' AND '2005-12-31'
如果这种商品的数量非常多,差不多占了SALES表的记录的50%或更多。那么使用SALE_DATE字段上索引来计算平均数就有些慢。因为如果使
用索引,就得对索引进行排序操作。当满足条件的记录非常多时(如占整个表的记录的50%或更多的比例),速度会变慢,这样还不如对整个表进
行扫描。
因此,MySQL会自动根据满足条件的数据占整个表的数据的比例自动决定是否使用索引进行查询。
对于MySQL来说,上述的查询结果占整个表的记录的比例是30%左右时就不使用索引了,这个比例是MySQL的开发人员根据他们的经验得出
的.
然而,实际的比例值会根据所使用的数据库引擎不同而不同。
三、在实际操作过程中,应该选取表中哪些字段作为索引?
1.选择唯一性索引
2.为经常需要排序、分组和联合操作的字段建立索引
3.为常作为查询条件的字段建立索引
4.限制索引的数目
5.尽量使用数据量少的索引
6.尽量使用前缀来索引
7.删除不再使用或者很少使用的索引