讲解MySQL建立索引 优化ORDER BY语句
作者: qqread, 出处:IT专家网论坛, 责任编辑: 陈子琪,
2010-03-17 13:00
当你的程序和数据库结构/SQL语句已经优化到无法优化的程度,而程序瓶颈并不能顺利解决,那就是应该考虑使用诸如memcached这样的分布式缓存系统的时候了。
关于建立索引的几个准则:
1、合理的建立索引能够加速数据读取效率,不合理的建立索引反而会拖慢数据库的响应速度。
2、索引越多,更新数据的速度越慢。
3、尽量在采用MyIsam作为引擎的时候使用索引(因为MySQL以BTree存储索引),而不是InnoDB。但MyISAM不支持Transcation。
4、当你的程序和数据库结构/SQL语句已经优化到无法优化的程度,而程序瓶颈并不能顺利解决,那就是应该考虑使用诸如memcached这样的分布式缓存系统的时候了。
5、习惯和强迫自己用EXPLAIN来分析你SQL语句的性能。
一个很容易犯的错误:
不要在选择的栏位上放置索引,这是无意义的。应该在条件选择的语句上合理的放置索引,比如where,order by。
例子:
SELECT id,title,content,cat_id FROM article WHERE cat_id = 1; |
上面这个语句,你在id/title/content上放置索引是毫无意义的,对这个语句没有任何优化作用。但是如果你在外键cat_id上放置一个索引,那作用就相当大了。
几个常用ORDER BY语句的MySQL优化:
1、ORDER BY + LIMIT组合的索引优化。如果一个SQL语句形如:
SELECT [column1],[column2],.... FROM [TABLE] ORDER BY [sort] LIMIT [offset],[LIMIT]; |
这个SQL语句优化比较简单,在[sort]这个栏位上建立索引即可。
2、WHERE + ORDER BY + LIMIT组合的索引优化,形如:
SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX] = [value] ORDER BY [sort] LIMIT[offset],[LIMIT]; |
这个语句,如果你仍然采用第一个例子中建立索引的方法,虽然可以用到索引,但是效率不高。更高效的方法是建立一个联合索引(columnX,sort)
3、WHERE + IN + ORDER BY + LIMIT组合的索引优化,形如:
SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX] IN ([value1],[value2],...) ORDER BY[sort] LIMIT [offset],[LIMIT]; |
这个语句如果你采用第二个例子中建立索引的方法,会得不到预期的效果(仅在[sort]上是using index,WHERE那里是using where;using filesort),理由是这里对应columnX的值对应多个。
这个语句怎么优化呢?我暂时没有想到什么好的办法,看到网上有便宜提供的办法,那就是将这个语句用UNION分拆,然后建立第二个例子中的索引:
SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX]=[value1] ORDER BY [sort] LIMIT[offset],[LIMIT] UNION SELECT [column1],[column2],.... FROM [TABLE] WHERE [columnX]=[value2] ORDER BY [sort] LIMIT[offset],[LIMIT] UNION …… |
但经验证,这个方法根本行不通,效率反而更低,测试时对于大部分应用强制指定使用排序索引效果更好点
4、不要再WHERE和ORDER BY的栏位上应用表达式(函数),比如:
SELECT * FROM [table] ORDER BY YEAR(date) LIMIT 0,30; |
5、WHERE+ORDER BY多个栏位+LIMIT,比如
SELECT * FROM [table] WHERE uid=1 ORDER x,y LIMIT 0,10; |
对于这个语句,大家可能是加一个这样的索引(x,y,uid)。但实际上更好的效果是(uid,x,y)。这是由MySQL处理排序的机制造成的。
以上例子你在实际项目中应用的时候,不要忘记在添加索引后,用EXPLAIN看看效果。
分享到:
相关推荐
- 经常出现在WHERE或ORDER BY语句中的列。 - 用于排序的列。 - 查询中与其他表关联的字段。 - 高并发环境下倾向于使用组合索引。 - 聚合函数的列(例如使用MAX(column_1)或COUNT(column_1)时的column_1)。 ##### ...
3. **使用索引辅助分页**:通过在排序字段上建立索引来提高分页效率。 4. **优化分页逻辑**:例如使用基于偏移量的分页或基于游标的分页。 #### 四、主从复制集群配置 1. **选择合适的复制模式**:同步复制可以...
1. SELECT语句:深入学习SELECT语句的使用,包括选择列、分组数据(GROUP BY)、聚合函数(COUNT、SUM、AVG、MAX、MIN)、排序(ORDER BY)、分页(LIMIT)等。 2. 联接查询:理解内连接(INNER JOIN)、外连接...
- **MySQL如何使用索引**:讲解MySQL内部如何利用索引来优化查询速度。 ##### 第6章 锁机制和事务控制 - **如何加锁**:介绍不同类型的锁及其加锁方法。 - **死锁**:讨论死锁产生的原因及其解决策略。 - **事务...
3. 对于SELECT查询,MySQL会使用查询优化器生成执行计划,考虑各种可能的执行路径,如索引选择、连接顺序、子查询优化等,以达到最快的执行速度。 4. 接下来,执行计划会被执行,访问控制模块检查用户权限,表管理...
- **使用LIMIT优化分页查询**:在进行分页查询时,使用`LIMIT`配合`ORDER BY`可以限制返回结果的数量,但应尽量避免在`ORDER BY`后的字段上没有索引,这可能导致全表排序。 - **避免在WHERE子句中使用NOT IN、!=、...
本文将深入讲解MySQL的一些常用语句,包括创建表、创建索引、修改表结构、删除数据对象以及执行查询。 1. 创建表 创建表是数据库设计的第一步,用于定义数据的结构。基本语法如下: ```sql CREATE TABLE table_name...
MySQL的查询包括SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY等。MySQL的索引包括普通索引、唯一索引、全文索引等。MySQL的事务包括事务的ACID属性、事务的隔离级别、事务的提交和回滚等。 MySQL的高级特性 ...
3. 查询语言(SELECT):深入理解查询语句,包括WHERE、ORDER BY、GROUP BY、HAVING等子句的用法。 五、索引与优化 1. 索引的概念:解释索引的作用,分析B-Tree、Hash、Full-text等不同类型索引的工作原理。 2. ...
- **基本查询语句**:熟悉`SELECT`语句及其子句(如`FROM`、`WHERE`、`ORDER BY`等),了解如何选择数据并对其进行排序、分组和筛选。 - **连接操作**:学会在多个表格间建立关联。掌握内连接、左连接、右连接和全...
7. 数据查询:深入理解JOIN操作,子查询,聚合函数(COUNT、SUM、AVG、MAX、MIN),排序(ORDER BY)、分组(GROUP BY)和筛选(HAVING)。 四、数据库设计 8. 第三方范式:了解第一范式(1NF)、第二范式(2NF)、...
INSERT INTO语句用于插入新记录,DELETE FROM和UPDATE用于删除和修改记录,而SELECT是最常用的查询语句,可以搭配WHERE、GROUP BY、HAVING、ORDER BY和JOIN子句进行复杂查询。在实际应用中,理解这些语句的用法至关...
第五章 数据查询:深入研究复杂的SQL查询技术,如子查询、聚合函数、排序(ORDER BY)、分页(LIMIT)等。此外,还会涉及连接操作的优化,如使用索引来提升查询性能。 第六章 数据视图:讲解视图的概念,如何创建和...
6. **查询数据**:讲解如何使用API执行复杂的查询,包括JOIN、WHERE子句、GROUP BY和HAVING子句、ORDER BY和LIMIT子句等。 7. **数据插入与更新**:详述INSERT、INSERT INTO...VALUES和INSERT INTO...SELECT等插入...
6. **查询与聚合函数**:深入理解SELECT语句的高级用法,如WHERE子句、ORDER BY、GROUP BY、HAVING和JOIN操作。同时,学习使用聚合函数(COUNT、SUM、AVG、MIN、MAX)对数据进行统计分析。 7. **事务处理**:理解...
3. **SQL基础**:掌握SQL语言的基本语法,如SELECT、INSERT、UPDATE、DELETE等操作,以及JOIN、WHERE、GROUP BY、ORDER BY等子句。 4. **PHP处理SQL结果**:学会使用PHP的fetch_array()函数等方法获取和遍历查询...
6. **07-MySQL高级查询.pdf**:这部分可能会涵盖联接(JOIN)、子查询、聚合函数(COUNT、SUM、AVG等)、分组(GROUP BY)和排序(ORDER BY)等高级查询技术。 7. **08-MySQL数据库设计.pdf**:数据库设计是数据库...
此外,还会涉及ORDER BY、GROUP BY、HAVING和JOIN等高级查询技巧,为后续的数据库操作打下坚实基础。 第三章:数据库设计与规范 此章探讨了数据库设计的基本原则,如范式理论(第一范式、第二范式和第三范式),...
下面将详细讲解MySQL的学习知识点,包括基础概念、安装配置、数据类型、表操作、查询语言、索引、事务处理以及优化策略。 1. **基础概念** - 数据库(Database):存储数据的结构化集合。 - 表(Table):数据库...
本文将深入讲解SQL语句在MySQL中的执行过程,包括MySQL的架构总览、查询执行流程以及SQL语句的解析顺序。 首先,我们来看MySQL的架构总览。MySQL是一个分层的系统,主要分为两个层次:SQL Layer(SQL层)和Storage ...