mysql索引优化和sql语句优化

一.mysql索引分为btree索引和hash索引。

btree索引是二叉树结构 先到索引树上找,再去根据索引到数据里边找数据。

hash索引是memory引擎,精准查询非常快,如果查范围内(where>8),会比较慢。因为是无序的,无法使用前缀索引。

2.btree索引

建立索引,通常是经常用到做查询条件,做分组,做排序。

独立索引,单个建索引只能用一个索引,通常用联合索引。 如建了一个(a,b,c)的复合索引,那么实际等于建了(a),(a,b),(a,b,c)三个索引,因为每多一个索引,都会增加写操作的开销和磁盘空间的开销

3.聚簇索引(innodb)和非聚簇索引(myisam),都用的是btree索引,但细节有不同。

非聚簇索引:myisam数据和索引树是分开的,你要先找数据先到索引树上找,找到之后再去数据上要数据。

聚簇索引:innodb 的数据和索引直接放在一起,当你找到索引树上找到时,数据也找到了,不要回行。(数据和索引挤在一块),innodb 次级索引,指向主键的索引,主键索引即存储索引,也存数据。(不需要回行,如果不规则数据插入会造成页分裂)

页分裂:主键没有规律,或者叶子(如varchar(10000))比较大(比较慢)

4. 理想的索引

1查询频繁,2区分度高(去重查询的数据/总count数据=1)。如(男,女区分度不高。就没有必要建索引),3索引长度

多列索引:1查询的频率,2区分度,3列的顺序(具体根据业务需求)

5.伪哈希索引,左前缀不好区分的列建立索引。如一列 url 存储www.baidu.com,www.weibo.com  入库的时间,可以加一个字段 crc 插入数据的时候添加crc32,转成32位的整数。

6.索引与排序(最后索引覆盖排序,如果没有用上索引,那么排序会生成一个临时表,要排序)

7.修复表(索引碎片与维护),数据在磁盘空间,不断的加入和修改。就会有碎片

可以1. alert table xxx engine innodb (如果表是innodb)  2.optimize table 表名

二.SQL语句优化 (查的快,取的快,传的少)

   执行sql 一个是等待时间,一个是执行时间

查询时间 一个是查找(索引),二是数据取出返回(send_data,不回行,索引覆盖,传的少)

1.原则,不查,少查,走索引,覆盖索引

2.大数据,拆分查询,能不连表就不连表(联查数据多了)

3.explain 解析sql语句

1.  关键部分 type 索引发挥的作用怎么样(

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。

)

2.possible_keys 估计用到的索引

3.key 用到的索引  (显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL)

4.rows  大概查询的行

5.Extra:包含MySQL解决查询的详细信息,也是关键参考项之一

Distinct
一旦MYSQL找到了与行相联合匹配的行,就不再搜索了

Not exists
MYSQL 优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,

就不再搜索了

Range checked for each

Record(index map:#)
没有找到理想的索引,因此对于从前面表中来的每一 个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一

Using filesort
看 到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来 排序全部行

Using index
列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表 的全部的请求列都是同一个索引的部分的时候

Using temporary
看到这个的时候,查询需要优化了。这 里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上

Using where
使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index, 这就会发生,或者是查询有问题

4.查看mysql运行时间

show variables like "%pro%";

设置开启方法: set profiling = 1;

show profiles 查看执行sql语句的情况

三 mysql 分页优化。

如果一个表数据2千万条,分页的时候从10万页 取10条

或许你就  limit  100000,10 这样性能就非常差。(mysql会查找前面10万页的数据和后面10条数据,然后再丢掉前边的10万条数据)

解决方案: 1根据实际情况,不让进行这么多的分页,如最大100页。(没必要翻那么多页,可以换一个关键词)

2根据索引 ,如数据表不删除除,只做逻辑删除。where id >100000 limit 100000 ,10  这里用到索引就比较快

 

原文地址:https://www.cnblogs.com/cx558/p/9946716.html

时间: 2024-10-26 06:35:09

mysql索引优化和sql语句优化的相关文章

ORACLE性能优化之SQL语句优化

版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 操作环境:AIX +11g+PLSQL 包含以下内容: 1.  SQL语句执行过程 2.  优化器及执行计划 3.  合理应用Hints 4.  索引及应用实例 5.   其他优化技术及应用 1.SQL语句执行过程 1.1 SQL语句的执行步骤 1)语法分析,分析语句的语法是否符合规范,衡量语句中各表达式的意义. 2)语义分析,检查语句中涉及的所有数据库对象是否存在,且用户有相应的权限. 3)视图转换,将涉及视图的查询语句转

(3)mysql优化之sql语句优化

概述 该篇主要介绍一些常用的sql优化技巧 sql优化 1.select * from table_name where; 建议将*改为需要的列.这对速度不会有明显的影响,主要考虑节省内存. 2.like语句 一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题.like "%aaa%" 不会使用索引而like "aaa%"可以使用索引. 3.不要在列上进行运算,无法运用索引 select * from users where YEAR(addda

mysql优化之SQL语句优化

Mysql优化是一个老生常谈的问题, 优化的方向也优化很多:从架构层;从设计层;从存储层;从SQL语句层; 今天讲解一下从SQL语句层: 这个部分是程序员最容易把控的地方,也是最容易忽视的地方. 一个好的SQL语句可以让mysql的压力降低不少,也能够看清楚一个程序员的能力水准. 可以从日常的工作中积累. 对于怎么查看explain执行计划,比较索引就不多说了. 如下总结的一些优化建议: a).可通过开启慢查询日志来找出较慢的SQL b).不做列运算:SELECT id WHERE age +

SQL Server优化之SQL语句优化

一切都是为了性能,一切都是为了业务 一.查询的逻辑执行顺序 (1) FROM left_table (3) join_type JOIN right_table (2) ON join_condition (4) WHERE where_condition (5) GROUP BY group_by_list (6) WITH {cube | rollup} (7) HAVING having_condition (8) SELECT (9) DISTINCT (11) top_specific

数据库性能优化之SQL语句优化

一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一.系统优化中一个很重要的方面就是SQL语句的优化.对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的SQL语句,提高系统的可用性. 在多数情况下,Oracle使用索

数据库性能优化之SQL语句优化1

一.问题的提出 在 应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实 际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一.系统优化中一个很重要的方面就是SQL语句的优化.对于海 量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的SQL语句,提 高系统的可用性. 在多数情况下,Oracl

[转]数据库性能优化之SQL语句优化1

一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一.系统优化中一个很重要的方面就是SQL语句的优化.对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的SQL语句,提高系统的可用性. 在多数情况下,Oracle使用索

数据库优化之SQL语句优化-记录

1. 操作符优化 (a) IN 操作符 从Oracle执行的步骤来分析用IN的SQL与不用IN的SQL有以下区别: ORACLE试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询.由此可见用IN的SQL至少多了一个转换的过程.一般的SQL都可以转换成功,但对于含有分组统计等方面的SQL就不能转换了. 推荐方案:在业务密集的SQL当中尽量不采用IN操作符,用EXISTS 方案代替. (b) NOT IN操作符 不能应用

数据库性能优化之SQL语句优化(下)

(1) 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2) WHERE子句中的连接顺序: ORACLE采用自下而上的顺序解析WHER