优化索引、sql语句、分析慢查询
设计表的时候严格根据数据的设计规范来设计数据库
使用缓存,把经常访问到的数据而且不需要变化的数据放到缓存中
一、什么是数据库索引
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。索引的一个主要目的就是加快检索表中数据,亦即能协助信息搜索者尽快的找到符合限制条件的记录ID的辅助数据结构。
例如这样一个查询:select * from table1 where id=10000。如果没有索引,必须遍历整个表,直到ID等于10000的这一行被找到为止;有了索引之后(必须是在ID这一列上建立的索引),即可在索引中查找。由于索引是经过某种算法优化过的,因而查找次数要少的多。可见,索引是用来定位的。
数据库索引有哪些呢?
- 聚集索引(主键索引):在数据库里面,所有行数都会按照主键索引进行排序。
- 非聚集索引:就是给普通字段加上索引。
- 联合索引:就是好几个字段组成的索引,称为联合索引。
索引总结:
为什么要创建索引呢?这是由于。创建索引能够大大提高系统的性能。
第一,通过创建唯一性索引,能够保证数据库表中每一行数据的唯一性。
第二,能够大大加快数据的检索速度。这也是创建索引的最基本的原因。
第三,能够加速表和表之间的连接,特别是在实现数据的參考完整性方面特别有意义。
第四。在使用分组和排序子句进行数据检索时。相同能够显著降低查询中分组和排序的时间。
第五,通过使用索引,能够在查询的过程中。使用优化隐藏器,提高系统的性能。
或许会有人要问:添加索引有如此多的长处,为什么不正确表中的每个列创建一个索引呢?这样的想法固然有其合理性。然而也有其片面性。尽管,索引有很多长处,可是,为表中的每个列都添加索引,是很不明智的。这是由于。添加索引也有很多不利的一个方面。
第一,创建索引和维护索引要耗费时间,这样的时间随着数据量的添加而添加。
第二,除了数据表占数据空间之外,每个索引还要占一定的物理空间。假设要建立聚簇索引,那么须要的空间就会更大。
第三,当对表中的数据进行添加、删除和改动的时候,索引也要动态的维护,这样就减少了数据的维护速度。
二、MySQL数据库如何优化
1、选取最适用的字段属性
MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小。
例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了。同样的,如果可以的话,我们应该使用MEDIUMINT而不是BIGIN来定义整型字段。
另外一个提高效率的方法是在可能的情况下,应该尽量把字段设置为NOTNULL,这样在将来执行查询的时候,数据库不用去比较NULL值。
2、使用索引
索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(),MIN()和ORDERBY这些命令的时候,性能提高更为明显。
那该对哪些字段建立索引呢?一般说来,索引应建立在那些将用于JOIN,WHERE判断和ORDERBY排序的字段上。(尽量不要对数据库中某个含有大量重复的值的字段建立索引。对于一个ENUM类型的字段来说,出现大量重复值是很有可能的情况)
对于查询占主要的应用来说,索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致。如果不加索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命的性能下降。但是也不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。
3、优化的查询语句
绝大多数情况下,使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用。
下面是应该注意的几个方面。
- 首先,最好是在相同类型的字段间进行比较的操作。
比如:int=int,VARCHAR=VARCHAR,但是作为特殊的情况,在CHAR类型的字段和VARCHAR类型字段的字段大小相同的时候,可以将它们进行比较。
- 其次,在建有索引的字段上尽量不要使用函数进行操作。
例如,在一个DATE类型的字段上使用YEAE()函数时,将会使索引不能发挥应有的作用。所以,下面的两个查询虽然返回的结果一样,但后者要比前者快得多。
- 第三,在搜索字符型字段时,我们有时会使用LIKE关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的。
例如下面的查询将会比较表中的每一条记录。
SELECT * FROMbooks WHERE name like"MySQL%"
但是如果换用下面的查询,返回的结果一样,但速度就要快上很多:
SELECT * FROM books WHERE name >= "MySQL" and name <"MySQM"
4、最好不使用like语句操作
一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
数据库SQL优化大总结之 百万级数据库优化方案
1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。
最好不要给数据库留NULL,尽可能的使用 NOT NULL填充数据库.
不要以为 NULL 不需要空间,比如:char(100) 型,在字段建立时,空间就固定了, 不管是否插入值(NULL也包含在内),都是占用 100个字符的空间的,如果是varchar这样的变长字段, null 不占用空间。
可以在默认为null值的字段设置数字0
3.应尽量避免在 where 子句中使用 != 或 <> 操作符,否则将引擎放弃使用索引而进行全表扫描。
4.应尽量避免在 where 子句中使用 or 来连接条件。
5.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。
6.索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有 必要。
7.尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连 接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。
8.尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。
9.任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
三、Linux相关命令
1、查询端口是否被占用:
- lsof -i:端口号 用于查看某一端口的占用情况,比如查看8000端口使用情况,lsof -i:8000
- netstat -tunlp |grep 端口号 用于查看指定的端口号的进程情况,如查看8000端口的情况,netstat -tunlp |grep 8000
2、杀死被占用的端口进程:
首先找到被占用的端口的进程 netstat -tunlp|grep {port} 例如:netstat -tunlp|grep {8000}
然后 kill -9 {PID} pid为进程号
四、spring如何整合mybatis
1、首先引入spring和mybatis相关依赖jar文件,如果使用maven可以在pom.xml文件里添加。mybatis-spring依赖,这个是mybatis和spring集成一起的关键桥梁。
2、在配置文件里添加jdbc数据源配置(一般用阿里的)
3、根据需要配置自动生成代码(添加generatorConfig.xml文件,mybatis逆向配置,可以根据数据库表结构生成dao、model、mapper文件,maven配置文件中添加mybatis-generator-maven-plugin插件)
4、创建mapper类和service类
5、配置mapper扫描(在resources目录下新建一个spring的配置文件,命名为applicationContext-db.xml,专门用来配置mybatis的数据库配置)
五、软件设计模式
(设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、程序的重用性)
这个你不必所以都掌握,说几个常用的就行:
- 单例模式
保证一个类仅有一个实例,并提供一个访问它的全局访问点。
- 工厂模式
定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。
- 策略模式(Strategy)
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。使得算法的变化可独立于使用它的用户。
- 适配器模式(Adapter)
将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。
- 观察者模式(Observer)
定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
六、数据库设计
需求分析——概念设计(*建立抽象的概念数据模型*)——逻辑设计(*数据模型*)——物理设计(*存储结构*)——验证设计——运行与维护设计
七、java基本的数据类型
Java语言提供九种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,一种字符串类型,还有一种布尔型。
1. byte 数据类型是8位
2. short 数据类型是 16 位
3.int 数据类型是32位
4.long 数据类型是 64 位
5. float 数据类型是单精度、32位
6. double 数据类型是双精度、64 位
7. boolean 数据类型:true 和 false;
8. char 类型是一个单一的 16 位 Unicode 字符
9. String 字符串类型
八、数据库字段类型
1、二进制数据类型:Binary、Varbinary、Image
2、字符数据类型:Char,Varchar和 Text
3、Unicode数据类型:Nchar,Nvarchar和Ntext
4、日期和时间数据类型:Datetime, Smalldatetime, Date, TimeStamp
九、自我介绍
答:我叫xxx,来自xx,就读于xx学校xx专业xx方向,从小喜欢操作计算机,所以就报考了计算机专业。主攻java web开发,也做过.net和android开发,掌握了软件开发的基本知识,现在已经能独立编写一些基本的项目。
我所学专业是软件开发,我希望能从事这方面的工作,并且在校期间曾经开发过多个系统,如人事在线门诊预约系统、权限管理系统、冷链车运输管理系统等等。
去年x月份到x月份在xx公司实习,岗位是xxx;大学期间,参加过学生会。自身有一定的学习能力,和团队协作精神。以上的简单自我介绍,我希望公司能给我一个展示自己能力的机会,让我可以学以致用,同时我也很欣赏XX公司的企业文化与工作环境。我愿意成为公司一员,和公司一同进步。
十、post跟get请求
两种 HTTP 请求方法:GET 和 POST
在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。
- GET - 从指定的资源请求数据。
- POST - 向指定的资源提交要被处理的数据
最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。
直观回答:
-
GET在浏览器回退时是无害的,而POST会再次提交请求。
-
GET产生的URL地址可以被Bookmark,而POST不可以。
-
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
-
GET请求只能进行url编码,而POST支持多种编码方式。
-
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
-
GET请求在URL中传送的参数是有长度限制的,而POST么有。
-
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
-
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
-
GET参数通过URL传递,POST放在Request body中。
基本对比:
1、url可见性:
get,参数url可见;post,url参数不可见
2、数据传输上:
get,通过拼接url进行传递参数;post,通过body体传输参数
3、缓存性:
get请求是可以缓存的;post请求不可以缓存
4、后退页面的反应
get请求页面后退时,不产生影响;post请求页面后退时,会重新提交请求
5、传输数据的大小
get一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样,但相差不大);post请求传输数据的大小根据php.ini 配置文件设定,也可以无限大。
6、安全性
这个也是最不好分析的,原则上post肯定要比get安全,毕竟传输参数时url不可见,但也挡不住部分人闲的没事在那抓包玩。安全性个人觉得是没多大区别的,防君子不防小人就是这个道理。对传递的参数进行加密,其实都一样。
区别对待:
(1)post更安全(不会作为url的一部分,不会被缓存、保存在服务器日志、以及浏览器浏览记录中)
(2)post发送的数据更大(get有url长度限制)
(3)post能发送更多的数据类型(get只能发送ASCII字符)
(4)post比get慢
(5)post用于修改和写入数据,get一般用于搜索排序和筛选之类的操作(淘宝,支付宝的搜索查询都是get提交),目的是资源的获取,读取数据
参考博文:https://blog.youkuaiyun.com/zzk220106/article/details/78595108/
=======核心理解=====
HTTP的底层是TCP/IP。所以GET和POST的底层也是TCP/IP,也就是说,GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。你要给GET加上request body,给POST带上url参数,技术上是完全行的通的。
GET和POST还有一个重大区别,简单的说:
GET产生一个TCP数据包;POST产生两个TCP数据包。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
十一、