mysql数据库一天五万条以上的增量,预计运维三年,怎么优化
MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
1、设计良好的数据库结构,允许部分数据冗余,尽量避免join查询,提高效率。
2、选择合适的表字段数据类型和存储引擎,适当的添加索引。
3、MySQL库主从读写分离。
4、找规律分表,减少单表中的数据量提高查询速度。
5、添加缓存机制,比如memcached,apc等。
6、不经常改动的页面,生成静态页面。
7、书写高效率的SQL。比如SELECTFROMTABEL改为SELECTfield1,field2,field3FROMTABLE。锁的优化策略
1、读写分离
2、分段加锁
3、减少锁持有的时间
多个线程尽量以相同的顺序去获取资源不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁。索引的底层实现原理和优化
B树,经过优化的B树主要是在所有的叶子结点中增加了指向下一个叶子节点的指针,因此InnoDB建议为大部分表使用默认自增的主键作为主索引。什么情况下设置了索引但无法使用
1、以开头的LIKE语句,模糊匹配
2、OR语句前后没有同时使用索引
3、数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)实践中如何优化MySQL
最好是按照以下顺序优化:
1、SQL语句及索引的优化
2、数据库表结构的优化
3、系统配置的优化
4、硬件的优化SQL注入漏洞产生的原因?如何防止?
SQL注入产生的原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。
防止SQL注入的方式:
开启配置文件中的magicquotesgpc和magicquotesruntime设置执行sql语句时使用addslashes进行sql语句转换Sql语句书写尽量不要省略双引号和单引号。
过滤掉sql语句中的一些关键词:update、insert、delete、select、。提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。为表中得字段选择合适得数据类型
字段类型优先级:整形date,timeenum,charvarcharblob,text优先考虑数字类型,其次是日期或者二进制类型,最后是字符串类型,同级别得数据类型,应该优先选择占用空间小的数据类型存储时期
Datatime:以YYYYMMDDHH:MM:SS格式存储时期时间,精确到秒,占用8个字节得存储空间,datatime类型与时区无关
Timestamp:以时间戳格式存储,占用4个字节,范围小197011到2038119,显示依赖于所指定得时区,默认在第一个列行的数据修改时可以自动得修改timestamp列得值
Date:(生日)占用得字节数比使用字符串。datatime。int储存要少,使用date只需要3个字节,存储日期月份,还可以利用日期时间函数进行日期间得计算Time:存储时间部分得数据
注意:不要使用字符串类型来存储日期时间数据(通常比字符串占用得储存空间小,在进行查找过滤可以利用日期得函数)
使用int存储日期时间不如使用timestamp类型解释MySQL外连接、内连接与自连接的区别
先说什么是交叉连接:交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。
内连接则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行。
外连接其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接。
左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以NULL来填充。右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换,MySQL目前还不支持全外连接。Myql中的事务回滚机制概述
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销。
要同时修改数据库中两个不同表时,如果它们不是一个事务的话,当第一个表修改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依旧是未修改之前的状态,而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候,当第一个表修改完,第二表修改出现异常而没能修改,第一个表和第二个表都要回到未修改的状态,这就是所谓的事务回滚SQL语言包括哪几部分?每部分都有哪些操作关键字?
SQL语言包括数据定义(DDL)、数据操纵(DML),数据控制(DCL)和数据查询(DQL)四个部分。
数据定义:CreateTable,AlterTable,DropTable,CraeteDropIndex等数据操纵:Select,insert,update,delete,
数据控制:grant,revoke数据查询:select完整性约束包括哪些?
数据完整性(DataIntegrity)是指数据的精确(Accuracy)和可靠性(Reliability)。
分为以下四类:
1、实体完整性:规定表的每一行在表中是惟一的实体。
2、域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等规定。
3、参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散。
4、用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用必须满足的语义要求。
与表有关的约束:包括列约束(NOTNULL(非空约束))和表约束(PRIMARYKEY、foreignkey、check、UNIQUE)。如何通俗地理解三个范式?
第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;
第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余范式化设计优缺点:
优点:可以尽量得减少数据冗余,使得更新快,体积小
缺点:对于查询需要多个表进行关联,减少写得效率增加读得效率,更难进行索引优化
反范式化:
优点:可以减少表得关联,可以更好得进行索引优化
缺点:数据冗余以及数据异常,数据得修改需要更多的成本什么是基本表?什么是视图?
基本表是本身独立存在的表,在SQL中一个关系就对应一个表。视图是从一个或几个基本表导出的表。视图本身不独立存储在数据库中,是一个虚表试述视图的优点?
(1)视图能够简化用户的操作
(2)视图使用户能以多种角度看待同一数据;
(3)视图为数据库提供了一定程度的逻辑独立性;
(4)视图能够对机密数据提供安全保护。NULL是什么意思
NULL这个值表示UNKNOWN(未知):它不表示(空字符串)。对NULL这个值的任何比较都会生产一个NULL值。您不能把任何值与一个NULL值进行比较,并在逻辑上希望获得一个答案。使用ISNULL来进行NULL判断为什么使用Executor框架?
每次执行任务创建线程newThread()比较消耗性能,创建一个线程是比较耗时、耗资源的。调用newThread()创建的线程缺乏管理,被称为野线程,而且可以无限制的创建,线程之间的相互竞争会导致过多占用系统资源而导致系统瘫痪,还有线程之间的频繁交替也会消耗很多系统资源。
接使用newThread()启动的线程不利于扩展,比如定时执行、定期执行、定时定期执行、线程中断等都不便实现。在Java中Executor和Executors的区别?
Executors工具类的不同方法按照我们的需求创建了不同的线程池,来满足业务的需求。
Executor接口对象能执行我们的线程任务。
ExecutorService接口继承了Executor接口并进行了扩展,提供了更多的方法我们能获得任务执行的状态并且可以获取任务的返回值。
使用ThreadPoolExecutor可以创建自定义线程池。
Future表示异步计算的结果,他提供了检查计算是否完成的方法,以等待计算的完成,并可以使用get()方法获取计算的结果。
分享就到这里啦,喜欢的朋友们点赞,收藏,加关注哦!领取资料后台私聊小编:即可免费领取!