MySQL语句优化的原则

1、使用索引来更快地遍历表。

  缺省情况下建立的索引是非群集索引,但有时它并不是最佳的。在非群集索引下,数据在物理上随机存放在数据页上。合理的索引设计要建立在对各种查询的分析和预测上。一般来说:
  a.有大量重复值、且经常有范围查询( > ,< ,> =,< =)和order by、group by发生的列,可考虑建立群集索引;
  b.经常同时存取多列,且每列都含有重复值可考虑建立组合索引;
  c.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。索引虽有助于提高性能但不是索引越多越好,恰好相反过多的索引会导致系统低效。用户在表中每加进一个索引,维护索引集合就要做相应的更新工作。

  2、在海量查询时尽量少用格式转换。

  3、ORDER BY和GROPU BY使用ORDER BY和GROUP BY短语,任何一种索引都有助于SELECT的性能提高。

  4、任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。

  5、IN、OR子句常会使用工作表,使索引失效。如果不产生大量重复值,可以考虑把子句拆开。拆开的子句中应该包含索引。
  6、只要能满足你的需求,应尽可能使用更小的数据类型:例如使用MEDIUMINT代替INT

  7、尽量把所有的列设置为NOT NULL,如果你要保存NULL,手动去设置它,而不是把它设为默认值。
  8、尽量少用VARCHAR、TEXT、BLOB类型
  9、如果你的数据只有你所知的少量的几个。最好使用ENUM类型
  10、正如graymice所讲的那样,建立索引。

  以下是我做的一个实验,可以发现索引能极大地提高查询的效率:

我有一个会员信息表users,里边有37365条用户记录:
在不加索引的时候进行查询:
sql语句A:

select * from users where username like ‘%许%‘;

在Mysql-Front中的8次查询时长为:1.40,0.54,0.54,0.54,0.53,0.55,0.54 共找到960条记录
sql语句B:

select * from users where username like ‘许%‘;

在Mysql-Front中的8次查询时长为:0.53,0.53,0.53,0.54,0.53,0.53,0.54,0.54 共找到836条记录
sql语句C:

select * from users where username like ‘%许‘;

在Mysql-Front中的8次查询时长为:0.51,0.51,0.52,0.52,0.51,0.51,0.52,0.51 共找到7条记录
为username列添加索引:

create index usernameindex on users(username(6));

再次查询:
sql语句A:

select * from users where username like ‘%许%‘;

在Mysql-Front中的8次查询时长为:0.35,0.34,0.34,0.35,0.34,0.34,0.35,0.34 共找到960条记录
sql语句B:

select * from users where username like ‘许%‘;

在Mysql-Front中的8次查询时长为:0.06,0.07,0.07,0.07,0.07,0.07,0.06,0.06 共找到836条记录
sql语句C:

select * from users where username like ‘%许‘;

在Mysql-Front中的8次查询时长为:0.32,0.31,0.31,0.32,0.31,0.32,0.31,0.31 共找到7条记录

  在实验过程中,我没有另开任何程序,以上的数据说明在单表查询中,建立索引的可以极大地提高查询速度。

  另外要说的是如果建立了索引,对于like ‘许%’类型的查询,速度提升是最明显的。因此,我们在写sql语句的时候也尽量采用这种方式查询。

  对于多表查询我们的优化原则是:
  尽量将索引建立在:left join on/right join on … +条件,的条件语句中所涉及的字段上。

  多表查询比单表查询更能体现索引的优势。

  11、索引的建立原则:
  如果一列的中数据的前缀重复值很少,我们最好就只索引这个前缀。Mysql支持这种索引。我在上面用到的索引方法就是对username最左边的6个字符进行索引。索引越短,占用的 磁盘空间越少,在检索过程中花的时间也越少。这方法可以对最多左255个字符进行索引。

  在很多场合,我们可以给建立多列数据建立索引。
  索引应该建立在查询条件中进行比较的字段上,而不是建立在我们要找出来并且显示的字段上

  12、一往情深问到的问题:IN、OR子句常会使用工作表,使索引失效。如果不产生大量重复值,可以考虑把子句拆开。拆开的子句中应该包含索引。

这句话怎么理解决,请举个例子
例子如下:
如果在fields1和fields2上同时建立了索引,fields1为主索引
以下sql会用到索引

select * from tablename1 where fields1=‘value1‘ and fields2=‘value2‘

以下sql不会用到索引

select * from tablename1 where fields1=‘value1‘ or fields2=‘value2‘

  13.索引带来查询上的速度的大大提升,但索引也占用了额外的硬盘空间(当然现在一般硬盘空间不成问题),而且往表中插入新记录时索引也要随着更新这也需要一定时间.
  有些表如果经常insert,而较少select,就不用加索引了.不然每次写入数据都要重新改写索引,花费时间; 这个视实际情况而定,通常情况下索引是必需的.

  14.我在对查询效率有怀疑的时候,一般是直接用Mysql的Explain来跟踪查询情况.
  你用Mysql-Front是通过时长来比较,我觉得如果从查询时扫描字段的次数来比较更精确一些.

时间: 2024-08-08 09:43:03

MySQL语句优化的原则的相关文章

9 MySQL语句优化的原则

1.使用索引来更快地遍历表. 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的.在非群集索引下,数据在物理上随机存放在数据页上.合理的索引设计要建立在对各种查询的分析和预测上.一般来说:  a.有大量重复值.且经常有范围查询( > ,< ,> =,< =)和order by.group by发生的列,可考虑建立群集索引:  b.经常同时存取多列,且每列都含有重复值可考虑建立组合索引:  c.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列.索引虽有助于提高性

mysql语句优化总结(一)

Sql语句优化和索引 1.Innerjoin和左连接,右连接,子查询 A.     inner join内连接也叫等值连接是,left/rightjoin是外连接. SELECT A.id,A.name,B.id,B.name FROM A LEFT JOIN B ON A.id =B.id; SELECT A.id,A.name,B.id,B.name FROM A RIGHT JOIN ON B A.id= B.id; SELECT A.id,A.name,B.id,B.name FROM

mysql语句优化方案(网上流传)

关于mysql处理百万级以上的数据时如何提高其查询速度的方法 最近一段时间由于工作需要,开始关注针对Mysql数据库的select查询语句的相关优化方法. 由于在参与的实际项目中发现当mysql表的数据量达到百万级时,普通SQL查询效率呈直线下降,而且如果where中的查询条件较多时,其查询速度简直无法容忍.曾经测试对一个包含400多万条记录(有索引)的表执行一条条件查询,其查询时间竟然高达40几秒,相信这么高的查询延时,任何用户都会抓狂.因此如何提高sql语句查询效率,显得十分重要.以下是网上

mysql 语句优化一列

优化前语句: SELECT ifnull(s.mileage, -1) as mile, s.fuel_hkm as val, t.fhkm_rank as rank, ifnull((select u.photo from app_user u where u.user_id = t.user_id  limit 1),'') as path, case when s.car_id = '***********' then 0 else 1 end as self, ifnull(( SELE

MySQL语句优化方法(简单版)

基础回顾: sql语句是怎么样运行的? 一般来说,客户端发送sql语句到数据库服务器——数据库服务器进行运算并返回结果——客户端显示sql语句运行结果. 在本地运行时以workbench为例,客户端为workbench,数据库服务器则是安装在本地的mysql数据库. 为什么要优化sql语句? 加快运行速度 减少数据库资源开销 在企业级数据库中sql优化是必备技能. 基础优化技能: 在查询语句中尽量减少查询语句返回结果,尤其是 SELECT*FROMXXX 来返回全部数据.只选择必要的数据,作为返

mysql语句优化技巧

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引.2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=03.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引

mysql 语句优化心得

排序导致性能较慢 优化策略:1.尽量不使用排序 2.只查有索引的结果然后 内连接查询 select  bizchance0_.*  from biz_chance bizchance0_, biz_bizcustomer bizbizcust1_ where bizchance0_.uuid=bizbizcust1_.recordinfoid and bizchance0_.ispublic=1          order by bizchance0_.orderkey desc limit

MySQL语句优化

一.优化SQL的一般步骤 a)通过SHOW STATUS;命令了解各种SQL的执行频率 SHOW [SESSION|GLOBAL] STATUS; SESSION (默认)表示当前连接 GLOBAL 表示自数据库启动至今 SHOW GLOBAL STATUS LIKE 'com_%' b)查看本次登录以来增删改查的次数 SHOW STATUS LIKE 'com_select%' SHOW STATUS LIKE 'com_update%' SHOW STATUS LIKE 'com_inser

Mysql语句优化小技巧

在使用group by 分组查询是,默认分组后,还会排序(Using filesort),可能会降低速度. 解决办法:加上order by null 不让它排序 select * from emp group by empno order by null; 有些情况下,可以使用连接来替代子查询.因为使用join,MySQL不需要在内存中创建临时表 select * from dept, emp where dept.deptno=emp.deptno; [简单处理方式] select * fro