营销型网站建设 课程,农行网站不出动画怎么做,主播做的头像在哪个网站上做的,wordpress登录qq1. sql语句优化
1.1 优化查询过程中的数据访问
访问数据太多导致查询性能下降确定应用程序是否在检索大量超过需要的数据#xff0c;可能是太多行或列确认MySQL服务器是否在分析大量不必要的数据行避免犯如下SQL语句错误 查询不需要的数据。解决办法#xff1a;使用limit解…1. sql语句优化
1.1 优化查询过程中的数据访问
访问数据太多导致查询性能下降确定应用程序是否在检索大量超过需要的数据可能是太多行或列确认MySQL服务器是否在分析大量不必要的数据行避免犯如下SQL语句错误 查询不需要的数据。解决办法使用limit解决多表关联返回全部列。解决办法指定列名总是返回全部列。解决办法避免使用SELECT *重复查询相同的数据。解决办法可以缓存数据下次直接读取缓存是否在扫描额外的记录。解决办法 使用explain进行分析如果发现查询需要扫描大量的数据但只返回少数的行可以通过如下技巧去优化 使用索引覆盖扫描把所有的列都放到索引中这样存储引擎不需要回表获取对应行就可以返回结果。改变数据库和表的结构修改数据表范式重写SQL语句让优化器可以以更优的方式执行查询。
1.2 优化长难的查询语句
一个复杂查询还是多个简单查询MySQL内部每秒能扫描内存中上百万行数据相比之下响应数据给客户端就要慢得多使用尽可能小的查询是好的但是有时将一个大的查询分解为多个小的查询是很有必要的。切分查询将一个大的查询分为多个小的相同的查询一次性删除1000万的数据要比一次删除1万暂停一会的方案更加损耗服务器开销。分解关联查询让缓存的效率更高。执行单个查询可以减少锁的竞争。在应用层做关联更容易对数据库进行拆分。较少冗余记录的查询。
1.3 优化特定类型的查询语句
count(*)会忽略所有的列直接统计所有列数不要使用count(列名)MyISAM中没有任何where条件的count(*)非常快。当有where条件时MyISAM的count统计不一定比其它引擎快。可以使用explain查询近似值用近似值替代count(*)增加汇总表使用缓存
1.4 优化关联查询
确定ON或者USING子句中是否有索引。确保GROUP BY和ORDER BY只有一个表中的列这样MySQL才有可能使用索引。
1.5 优化子查询
用关联查询替代优化GROUP BY和DISTINCT
1.6 优化LIMIT分页
LIMIT偏移量大的时候查询效率较低可以记录上次查询的最大ID下次查询时直接根据该ID来查询
1.7 优化UNION查询
UNION ALL的效率高于UNION
1.8 优化WHERE子句
对查询进行优化应尽量避免全表扫描首先应考虑在 where 及 order by 涉及的列上建立索引。应尽量避免在 where 子句中对字段进行 null 值判断否则将导致引擎放弃使用索引而进行全表扫描如
select id from t where num is null
-- 可以在num上设置默认值0确保表中num列没有null值然后这样查询
select id from t where num0应尽量避免在 where 子句中使用!或操作符否则引擎将放弃使用索引而进行全表扫描。应尽量避免在 where 子句中使用or 来连接条件否则将导致引擎放弃使用索引而进行全表扫描如
select id from t where num10 or num20
-- 可以这样查询
select id from t where num10 union all select id from t where num20in 和 not in 也要慎用否则会导致全表扫描如
select id from t where num in(1,2,3)
-- 对于连续的数值能用 between 就不要用 in 了
select id from t where num between 1 and 3下面的查询也将导致全表扫描select id from t where name like ‘%李%’若要提高效率可以考虑全文检索不过只做右侧模糊左侧不模糊还是会用到索引如果在 where 子句中使用参数也会导致全表扫描。因为SQL只有在运行时才会解析局部变量但优化程序不能将访问计划的选择推迟到运行时它必须在编译时进行选择。然 而如果在编译时建立访问计划变量的值还是未知的因而无法作为索引选择的输入项。如下面语句将进行全表扫描
select id from t where numnum
-- 可以改为强制查询使用索引
select id from t with(index(索引名)) where numnum应尽量避免在 where 子句中对字段进行表达式操作这将导致引擎放弃使用索引而进行全表扫描。如
select id from t where num/2100
-- 应改为:
select id from t where num100*2应尽量避免在where子句中对字段进行函数操作这将导致引擎放弃使用索引而进行全表扫描。如
select id from t where substring(name,1,3)’abc’
-- name以abc开头的id应改为:
select id from t where name like ‘abc%’不要在 where 子句中的“”左边进行函数、算术运算或其他表达式运算否则系统将可能无法正确使用索引。
2. 数据库结构优化
2.1 将字段很多的表分解成多个表
对于字段较多的表如果有些字段的使用频率很低可以将这些字段分离出来形成新表。
因为当一个表的数据量很大时会由于使用频率低的字段的存在而变慢。
2.2 增加中间表
对于需要经常联合查询的表可以建立中间表以提高查询效率。
通过建立中间表将需要通过联合查询的数据插入到中间表中然后将原来的联合查询改为对中间表的查询。
2.3 增加冗余字段
设计数据表时应尽量遵循范式理论的规约尽可能的减少冗余字段让数据库设计看起来精致、优雅。但是合理的加入冗余字段可以提高查询速度。
表的规范化程度越高表和表之间的关系越多需要连接查询的情况也就越多性能也就越差。
注意
冗余字段的值在一个表中修改了就要想办法在其他表中更新否则就会导致数据不一致的问题。