1. 阻止使用 select * 你需要什么信息,就查询什么信息,查询的多了,查询的速率一定就会慢
2. 当你只需要查询出一条数据的时刻,要使用 limit 1 好比你要查询数据中是否有男生,只要查询一条含有男生的纪录就行了,后面不需要再查了,使用Limit 1 可以在找到一条数据后住手搜索
3. 确定高性能的索引 索引不是随便加的也不是索引越多越好,更不是所有索引对查询都有用
4. 建数据库表时,给字段设置牢靠合适的巨细. 字段不能设置的太大,设置太大就造成虚耗,会使查询速率变慢
5. 要只管使用not null
6. EXPLAIN 你的 SELECT 查询 使用EXPLAIN,可以辅助你更领会MySQL是若那边理你的sql语句的, 你可以查看到sql的执行设计,这样你就能更好的去领会你的sql语句的不足,然后优化语句.
7. 在Join表的时刻,被用来Join的字段,应该是相同的类型的,且字段应该是被建过索引的,这样,MySQL内部会启动为你优化Join的SQL语句的机制。
8. 若是你有一个字段,好比“性别”,“国家”,“民族”, “省份”,“状态”或“部门”,这些字段的取值是有限而且牢靠的,那么,应该使用 ENUM 而不是 VARCHAR。
由于在MySQL中,ENUM类型被看成数值型数据来处置,而数值型数据被处置起来的速率要比文本类型快得多。这样,我们又可以提高数据库的性能。
9. 垂直支解 将常用和有关系的字段放在相同的表中,把一张表的数据分成几张表 这样可以降低表的庞大度和字段的数目,从而到达优化的目的
10. 优化where查询
①. 阻止在where子句中对字段进行表达式操作
好比: select 列 from 表 where age*2=36; 建议改成 select 列 from 表 where age=36/2;
②. 应只管阻止在 where 子句中使用 !=或 操作符,否则将引擎放弃使用索引而进行全表扫描。
③. 应只管阻止在 where 子句中对字段进行 null 值 判断
④. 应只管阻止在 where 子句中使用 or 来毗邻条件
11. 不建议使用%前缀模糊查询,这种查询会导致索引失效而进行全表扫描
例如LIKE “%name”或者LIKE “%name%这两种都是不建议的.然则可以使用LIKE “name%”。
对于LIKE “%name%,可以使用全文索引的形式
12. 要慎用in和 not in
例如:select id from t where num in(1,2,3) 建议改成 select id from t where num between 1 and 3
对于延续的数值,能用 between 就不要用 in 了
13. 明白in和exists, not in和not exists的区别
许多时刻用 exists 取代 in 是一个好的选择:如查询语句使用了not in那么内外表都进行全表扫描,没用到索引,而not exists子查询依然能用到表上索引,以是无论哪个表大,用not exists都比not in要快。
select num from a where num in(select num from b)
建议改成: select num from a where exists(select 1 from b where num=a.num)
区分in和exists主要是造成了驱动顺序的改变(这是性能转变的关键),若是是exists,那么以外层表为驱动表,先被接见,若是是IN,那么先执行子查询。以是IN适合于外表大而内表小的情形;EXISTS适合于外表小而内表大的情形。
关于not in和not exists,推荐使用not exists,不仅仅是效率问题,not in可能存在逻辑问题
14. 明白select Count (*)和Select Count(1)以及Select Count(column)区别
一样平常情形下,Select Count (*)和Select Count(1)两着返回效果是一样的
若是表没有主键(Primary key), 那么count(1)比count(*)快,
若是有主键的话,那主键作为count的条件时刻count(主键)最快
若是你的表只有一个字段的话那count(*)就是最快的
count(*) 跟 count(1) 的效果一样,都包罗对NULL的统计,而count(column) 是不包罗NULL的统计
手艺交流请关注“大数据java架构师”
安卓系统优化方法?