数据库和sql优化的几种方式

(1).索引

把数据根据一些算法算出一个值,把数据放入到一个区域内,这个值对应那个区域,来查询数据的时候,可以快速的根据数据值定位到某个区域,快速找到某个值。
比如字典,可以根据拼音快速找到某个字,索引就是根据把数据计算完成后放到一个区域内,下次找的时候,直接根据索引去某个区域拿值,这样查询快。

怎么创建索引

通过Navicat工具创建的,当然也可以通过sql创建。

什么时候创建索引

创建表就要创建索引,选定那个字段要创建索引,不要所有字段都创建索引.经常查询或经常当where条件的,创建索引。

使用索引好处

查询快,不好的是进行insert、update、delete的时候慢
因为索引占磁盘空间,降低增删改的性能.所以不能每个字段都创建索引。
最好的方式是实现读写分离,读的时候有索引,写表里没有索引。

索引的方式

问你用什么索引?

你说BTree(一般用的都是BTree索引)。

为什么不用hash索引呢?

因为hash索引有算法漏洞,计算出的hash值容易重复,造成索引的值一致,这时候数据就会查询出两条,其实我要是一条,这时就会报错。

索引有单个索引和组合索引,什么时候用哪个?

单个索引和复合索引介绍及优缺点:http://blog.csdn.net/linminqin/article/details/44342205

单个索引什么时候失效?

使用like语句查询失效

组合什么时候失效?比如id和name字段是一个组合索引。

索引失效 id,name

1、顺序颠倒时候失效,如where name=value and id = value这是顺序颠倒
2、使用like语句时候失效
3、如果查询时使用id查询索引不失效,使用name查询会失效 如where name=value 索引失效 如where id=value 索引不失效

索引遵循最左原则,也就是说,组合索引是从左往右查询数据的,最左边属性必须有,跳属性就不管用,数据查不到 在使用like语句查询时失效

Id,name,age == 算法算完后会计算出一个值 12345678
查询条件1:id,age索引失效吗?失效
查询条件2:id,name索引失效吗?不失效
查询条件3:name,age索引失效吗?失效
查询条件4:name,id索引失效吗?失效
查询条件5:id索引失效吗?不失效

索引的类型有哪些?

一般索引(normal):可重复的,存可重复数据的时候可以使用
唯一索引(unique):存的数据是不可重复的,身份证号的时候使用使用,唯一索引不可重复
全文索引(fulltext):存大的字段值时使用,我存一篇文章,我想要搜索搜索数据,这时候用这个fulltext索引查询的会比较快

你怎么知道索引创建完成后,查询时有没有用到索引呢?

可以用explain关键字可以看到索引有没有问题。索引有没有生效。

你已经创建索引了,可还是慢,到底是索引的问题呢?还是数据量大的问题呢?
你怎么用explain的。写sql语句前面跟一个explain关键字就可以 你看explain里面的什么东西,怎么知道它有没有效果的?

1、看key可以看到它有没有用到索引
2、Rows 看看数据到底扫描了多少行
3、Type看看有没有执行全表扫描,如果执行全表扫描肯定就慢了 既然索引没问题,那就是数据量大呗?你怎么进行优化?
1、加redis缓存
2、分库分表,根据插入的时间拆分表

(2)sql本身优化

不用*,少用函数和like,不用嵌套语句,大sql拆小sql等
这个博客很详细了:http://blog.csdn.net/jie_liang/article/details/77340905

(3)加冗余字段

优化前:
汽车表: id,name,汽车的尺寸,汽车颜色,汽车的生产厂家表的id字段 生产厂家表 id,name,地址信息。

我需要展示汽车的信息列表,列表展示信息中需要包含生产厂家时,如果left join,效率会低 如果在单表中查询,速度快,

我现在对数据库进行添加冗余字段,对数据库数据优化

优化后:
汽车表: id,name,汽车的尺寸,汽车颜色,汽车的生产厂家表的id字段,厂家的名字 生产厂家表 id,name,地址信息。

不能所有的字段都加成冗余字段,一定是不常变化的字段为冗余字段

什么时候可以加冗余字段?什么情况下不可以加呢?

如果这个冗余字段的数据经常改变,就不建议加冗余字段了

(4)不创建外键,靠代码和sql控制

安全性要求不是很高,并且数据量很大的时候,可以不需要外键。 银行项目,安全性要求很高的项目是必须用外键的。

用外键会降低插入数据的速度,不用外键靠sql和代码控制完全不影响使用。

(5)读写分离,主从复制

(6)数据库参数调优(专业DBA处理)

(7)服务器优化(专业运维或项目经理处理)

mysql常用的有两种引擎

MyISAM引擎是最原始引擎,没有事务,事务控制是在后来添加上的,后来的引擎里有事务控制,这个引擎就是InnoDB。
事务选InnoDB,并发查询的时候,不需要用事务时处理选MyISAM 在不同场景,调用的引擎不一样.

如何去看这个sql有没有用到索引?

Sql前面加explain关键字,就可以看到有没有用索引,并且可以看它扫描了多少行数据

用explain看性能:http://blog.csdn.net/u010061060/article/details/52473244

设置慢查询日志后,它会自动将慢的sql语句收集起来,然后查看慢的sql语句,针对比较慢的sql进行优化.
开启慢查询:https://www.cnblogs.com/siqi/archive/2012/11/21/2780966.html

数据库行列转换:

http://blog.csdn.net/sinat_27406925/article/details/77507478
http://blog.csdn.net/aya19880214/article/details/41280893

篇末福利:
大厂面试题

1.索引的使用?组合索引的使用?最左原则的使用?索引的各种类型?你是怎么建索引的?
2.为什么用btree,优点是什么?
3. 你举个订单表的例子或购物车的例子怎么创建索引的? 我们购物车没有用数据库,存redis的,我给你举个创建索引的例子把。
4. 用户关联课程表,用户的id创建索引,课程id创建索引,购买了哪个课程,那我购买表中有用户id和课程id,这两个字段一点有索引,用的是组合索引,索引类型是一般索引。
5. 你说下数据库两个引擎的作用? 你们数据库的数据量有多少?你们商品表的商品数量有多少?
6.所有表的数据量加起来吗?这个我没算过,我们用户量有五万多,商品数量有十五万多等等自己随口编。 你说下索引的弊端吧?
7.hash有弊端,所以很少使用 mysql默认隔离级别是啥:重复读
https://blog.csdn.net/qq_33290787/article/details/51924963
8.mysql的存储引擎用的是什么?myisam和innerdb的区别是啥?数据库方面的优化做过吗?
9. 比如我有条sql,发现它执行的比较慢,你怎么进行优化,你的思路是啥?(explain看看性能再说)
10.通过创建索引的方式优化的话,你怎么知道索引有没有用到?你怎么知道它会不会失效? 数据库索引的长度是多少?你知道索引的结构吗?(b加tree)
11 用索引吗?主键索引和唯一索引的区别是什么?唯一索引的字段可以为null吗?索引的最大长度多少?索引什么时候失效?索引有几种类型?
12 你们是如何做分库分表的? 我们项目目前没有用到或说我们做了读写分离

13mysql的四种隔离级别说下,事务的隔离级别谁高谁低?

14说下mysql优化。用到哪个引擎,哪个版本呢?哪些字段加索引? 什么情况下加索引,对应哪些字段。

15一个是聚簇索引,一个是非聚簇索引,了解吗?

16 说下mysql的索引。索引的具体作用。 mysql分页说下它怎么使用的,并说下后面两个参数的作用。 Limit 第一个是第几页;第二个是每页多少条
17. 如何测试sql的性能(explain) sql优化具体是如何做的?在什么场景下使用了? 创建索引,加冗余,说十五条sql优化知识。
18.课程详情页的使用场景,关联了多张表。
19.你用过什么数据库?左连接、右连接和全连接的作用和比较和区别。 知道mysql的引擎吧,有啥区别?
20.说下sql语句优化 数据库表你设计过吗?说下你是怎么设计的?
21.sql优化说下。 平时用什么数据库? sql的优化会吗?
这个sql是正常跑的,我想给他进行优化,你会怎么进行优化?怎么知道sql有没有优化的空间?
22. 写sql写的多吗? 错误回答:sql都是工具类生成的,sql不需要自己写,直接调用工具就行。
23.索引的使用,组合索引的使用,最左原则的使用,索引的各种类型,你是怎么建索引的,你举个订单表的例子或购物车的例子怎么创建索引的,为什么用btree,优点是什么?
24.了解过数据库的存储过程吗? sql的存储过程使用。 说下分布式事务吗? 事务和锁有什么关系吗? 悲观锁和乐观锁的区别说下。
25.join的性能有了解过吗? 阿里有个技术开发规范了解吗?(阿里开发手册里有,自己看)
26.阿里说一般join关联不让超过三个表,太慢。一般用mybatis的conlletion的关联做处理。
27.数据库死锁怎么造成的? 分布式事务是如何处理的 悲观锁和乐观锁说下是怎么用的。
28.数据库锁了解吗?介绍下悲观和乐观锁。代码层面最简单的乐观锁使用。 数据库引擎了解吗?数据库的行级锁和表级锁了解吗?

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猫A建仔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值