当前位置: 首页 > MySQL > 关于mysql优化一些琐碎的知识点

关于mysql优化一些琐碎的知识点

  • 分类:MySQL
  • 本文标签: mysql优化
  • 发布时间:2015-09-19 09:42:33
  • 作者:Ferman
  • 查看数: 400

关于mysql需要注意的东西非常多,我这篇文章注意是一些杂项,自己能想到哪些就写什么。我准备之后整理下自己以前的笔记,专门写下几篇文章,包括,mysql索引的知识;mysql锁机制;mysql在大项目中的分表策略以及读写分离;mysql中一些原理函数的学习;mysql建表的基本原则,优化原则等,总之有很多的东西,我有时间了会一篇篇的写出来,作为总结,也作为自己备份用。今天是周六,早上却跟打了鸡血一样。

这些东西可能大家都了解,但是在实际项目中你不一定刚好想到,但是重新看一遍,就会加深一遍印象。关于mysql一些小的知识点:

1、给出几个id,要求查处数据并且按这几个id排序。

也会是查值并order by几个id,需要用到mysql中FIELD这个关键字,比如:

$id = '4,3,7,5,9,78';

SELECT * FROM items WHERE id IN ($id) ORDER BY FIELD(id,".$id.");

2、mysql字符串连接语句

update `tablex` set zmname=concat(`tablex`.zmname,"连接字符串") where zsubid=943

3、精度比较高的数据用

比如涉及到了金钱。那么类型用mysql的decimal类型

4、replace into用来避免有唯一索引时用insert时出现错误

前提是该表必须有唯一索引的字段,且这个字段不允许为空。如果要求多个字段不同,则加联合唯一索引,比如要name,title两个字段不相同才不能插入,那么建立这两个字段的联合索引,索引类型是unique的。

5、有时候一些小项目比如公司内部小调查等可能会用到like查询

like查询时解决匹配中文不准确的问题用binary这个关键字:

name LIKE binary '%".$keyword."%'

6、核心sql或者数据量大跑数据时一定加索引

切记切记

7、关于where条件的顺序

where后语句中如果不涉及联合索引,多个条件的顺序是没有关系的。如s1='xx' and s2='yy',这两个顺序反过来效果也是一样的,mysql的查询优化器会自动调节顺序。

8、仅有几个值的字段不要加索引

比如状态字段,类型,值可能就两三个 ,但是往往这些字段反而会大量用到where,但是即便这样也不建议加索引。因为这设计到索引扫描的问题,描述起来比较困难,如果对唯一性太差的字段加索引的话,在网上有这么一段话:通过索引查找键值为A和B的某些数据,通过A找到某条相符合的数据,这条数据在X页上面,然后继续扫描,又发现符合A的数据出现在了Y页上面,那么存储引擎就会丢弃X页面的数据,然后存储Y页面上的数据,一直到查找完所有对应A的数据,然后查找B字段,发现X页面上面又有对应B字段的数据,那么他就会再次扫描X页面,等于X页面就会被扫描2次甚至多次。以此类推,所以同一个数据页可能会被多次重复的读取,丢弃,在读取,这无疑给存储引擎极大地增加了IO的负担。

9、设计到取固定几个id值时,能用in尽量不用or

mysql会对in里的列表,进行排序然后再二分查找检索,值越多的话,in越快。

10、distinct与group by的区别

这两个可以做出相同的查询,非常类似,但是group by的效率要高,因为它没有filesort的操作,所以尽量用group by。

不要在大结果集用distinct,尤其是没有索引的情况

11、所有字段要not null

因为1.null很难查询优化,2.null加索引的话会浪费额外的空间,3.含有null的复合索引无效

12、为了效率,鼓励表中有一定的冗余

但是业务的核心字段必须遵守范式,如密码、手机号等

13、多分析慢查询,常用explain

14、关于防止重复插入

能用 insert ignore 不要用 insert replace。为什么,ignore:如果插入的行存在则跳过,replace:如果插入的行存在,则删除存在的,再插入新的。所以ignore快点。


转载时请以 超链接的形式 注明:转自Ferman

  • 杨道伟

    第十二条 怎么解释?

  • hongbo819

    回复 杨道伟:对核心字段或者经常修改的字段如果冗余过多,那么修改时容易漏掉,这也是为什么nosql难以取代关系型数据库原因之一,冗余大。

                  

About me