赞
踩
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。
若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。加锁是实现数据库并发控制的一个非常重要的技术。
MySQL 的 三种锁:
(1)表级锁:
开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
(2)行级锁:
开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
(3)页面锁:
开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
(1)MyISAM
(2)Heap
(3)Merge
(4)INNODB
(5)ISAM
(1)如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。
(2)如果两个对象不equals,他们的hashcode有可能相等。
(3)如果两个对象hashcode相等,他们不一定equals。
(4)如果两个对象hashcode不相等,他们一定不equals。
第一范式:1NF 是对属性的原子性约束,要求属性具有原子性,不可再分解;
第二范式:2NF 是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;
第三范式:3NF 是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。
范式化设计优缺点:
优点:
(1)可以尽量得减少数据冗余,使得更新快,体积小缺点:对于查询需要多个表进行关联,减少写得效率增加读得效率,
更难进行索引优化反范式化:
(2)可以减少表得关联,可以更好得进行索引优化
缺点:
(1)数据冗余以及数据异常,数据得修改需要更多的成本
索引是对数据库表中一个或多个列的值进行排序的结构,是帮助MySQL高效获取数据的数据结构,数据库的索引类似于书籍的索引。
MySQL基本的索引类型:
(1)普通索引:基本的索引类型,没有唯一性的限制,允许为NULL值。
(2)唯一索引:数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
(3)主键索引:数据列不允许重复,不允许为NULL,一个表只能有一个主键。
(4)全文索引:是目前搜索引擎使用的一种关键技术。
优点:
(1)索引加快数据库的检索速度
(2)索引降低了插入、删除、修改等维护任务的速度
(3)唯一索引可以确保每一行数据的唯一性
(4)通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能
(5)索引需要占物理和数据空间
缺点:
(1)创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;
(2)索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;
(3)当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。
(1)查询中很少使用到的列 不应该创建索引,如果建立了索引然而还会降低mysql的性能和增大了空间需求.
(2)很少数据的列也不应该建立索引,比如 一个性别字段 0或者1,在查询中,结果集的数据占了表中数据行的比例比较大,
mysql需要扫描的行数很多,增加索引,并不能提高效率
(3)定义为text和image和bit数据类型的列不应该增加索引,
(4)当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不应该创建索引,这两个操作是互斥的关系
(1)如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)
注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
(2)对于多列索引,不是使用的第一部分,则不会使用索引
(3)like查询是以%开头,模糊匹配
(4)如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
(5)如果mysql估计使用全表扫描要比使用索引快,则不使用索引
MyISAM:
不支持事务,但是每次查询都是原子的;
支持表级锁,即每次操作是对整个表加锁;
存储表的总行数;
一个 MYISAM 表有三个文件:索引文件、表结构文件、数据文件;
采用菲聚集索引,索引文件的数据域存储指向数据文件的指针。
辅索引与主索引基本一致,但是辅索引不用保证唯一性。
InnoDb:
支持 ACID 的事务,支持事务的四种隔离级别;
支持行级锁及外键约束:因此可以支持写并发;
不存储总行数:一个 InnoDb 引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多个文件里),也有可能为多个(设置为独立表空,表大小受操作系统文件大小限制,一般为 2G),受操作系统文件大小的限制;主键索引采用聚集索引(索引的数据域存储数据文件本身),辅索引的数据域存储主键的值;因此从辅索引查找数据,需要先通过辅索引找到主键值,再访问辅索引;最好使用自增主键,防止插入数据时,为维持 B+树结构,文件的大调整。
SQL 标准定义的四个隔离级别为:
(1)read uncommited :读到未提交数据
(2)read committed:脏读,不可重复读
(3)repeatable read:可重读
(4)serializable :串行事物
(1)CHAR 和 VARCHAR 类型在存储和检索方面有所不同
(2)CHAR 列长度固定为创建表时声明的长度,长度值范围是 1 到 255 当 CHAR值被存储时,它们被用
空格填充到特定长度,检索 CHAR 值时需删除尾随空格。
表格的每一行都由主键唯一标识,一个表只有一个主键主键也是候选键。按照惯例,候选键可以被指定为主键,并且可以用于任何外键引用。
它用来压缩 MyISAM 表,这减少了磁盘或内存使用。
MyISAM Static 上的所有字段有固定宽度,MyISAM Static 在受损情况下更容易恢复。
MyISAM Dynamic表将具有像 TEXT,BLOB 等字段,以适应不同长度的数据类型。
当行被更改时,时间戳字段将获取当前时间戳。
列设置为 AUTO INCREMENT 时,如果在表中达到最大值,会发生什么情况?
它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。
怎样才能找出最后一次插入时分配了哪个自动增量?
LAST_INSERT_ID 将返回由 Auto_increment 分配的最后一个值,并且不需要指定表名称。
%对应于 0 个或更多字符,_只是 LIKE 语句中的一个字符。
BLOB 是一个二进制对象,可以容纳可变数量的数据。
TEXT 是一个不区分大小写的 BLOB。
BLOB 和 TEXT 类型之间的唯一区别在于对 BLOB 值进行排序和比较时区分大小写,对 TEXT 值不区分大小写。
NOW()命令用于显示当前年份,月份,日期,小时,分钟和秒。CURRENT_DATE()仅显示当前年份,月份和日期。
在缺省模式下,MySQL 是 autocommit 模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下,MySQL 是不支持事务的。
但是如果你的 MySQL 表类型是使用 InnoDB Tables 或 BDB tables 的话,你的MySQL 就可以使用事务处理。
字符串类型是:
(1)SET
(2)BLOB
(3)ENUM
(4)CHAR
(5)TEXT
NULL 这个值表示 UNKNOWN(未知):它不表示“”(空字符串)。
对 NULL 这个值的任何比较都会生产一个 NULL 值。您不能把任何值与一个 NULL 值进行比较,
并在逻辑上希望获得一个答案。使用 IS NULL 来进行 NULL 判断
事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有 操作都成功,则认为事务成功,
即使只有一个操作失败,事务也不成功。如果所 有操作完成,事务则提交,其修改将作用于所有其他数据库进程。
如果一个操作 失败,则事务将回滚,该事务所有操作的影响都将取消。
事务特性:
1、原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。
2、一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状 态
3、隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何 其他事务,
4、持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后 有了其他故障,事务的处理结果也会得到保存。
存储过程是一个预编译的 SQL 语句,优点是允许模块化的设计,就是说只需创建一次,以后在该程序中就可以调用多次。如果某次操作需要执行多次 SQL,使用存储过程比单纯 SQL 语句执行要快。可以用一个命令对象来调用存储过程。
基本表:基本表是本身独立存在的表,在 SQL 中一个关系就对应一个表。
视图:视图是从一个或几个基本表导出的表。视图本身不独立存储在数据库中,是一个虚表。
游标:是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。
主键、外键和索引的区别
定义:
主键–唯一标识一条记录,不能有重复的,不允许为空
外键–表的外键是另一表的主键, 外键可以有重复的, 可以是空值
索引–该字段没有重复值,但可以有一个空值。
作用:
主键–用来保证数据完整性
外键–用来和其他表建立联系用的
索引–是提高查询排序的速度
个数:
主键–主键只能有一个
外键–一个表可以有多个外键
索引–一个表可以有多个唯一索引
(1)设计良好的数据库结构,允许部分数据冗余,尽量避免 join 查询,提高效率。
(2)选择合适的表字段数据类型和存储引擎,适当的添加索引。
(3)MySQL 库主从读写分离。
(4)找规律分表,减少单表中的数据量提高查询速度。
(5)添加缓存机制,比如 memcached,apc 等。
(6)不经常改动的页面,生成静态页面。
(7)书写高效率的 SQL。比如 SELECT * FROM TABEL 改为 SELECT field_1,field_2, field_3 FROM TABLE.
(1)读写分离
(2)分段加锁
(3)减少锁持有的时间
(4)多个线程尽量以相同的顺序去获取资源不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,
反而效率不如一次加一把大锁。
最好是按照以下顺序优化:
(1)SQL 语句及索引的优化
(2)数据库表结构的优化
(3)系统配置的优化
(4)硬件的优化
(1)选取最适用的字段属性,尽可能减少定义字段宽度,尽量把字段设置 NOTNULL,例如’省份’、’性别’最好适用 ENUM
(2)使用连接(JOIN)来代替子查询
(3)适用联合(UNION)来代替手动创建的临时表
(4)事务处理
(5)锁定表、优化事务处理
(6)适用外键,优化锁定表
(7)建立索引
(8)优化查询语句
(1)Where 子句中:where 表之间的连接必须写在其他 Where 条件之前,那些可以过滤掉最大数量记录的条件必须写在 Where 子句的末尾.HAVING 最后。
(2)用 EXISTS 替代 IN、用 NOT EXISTS 替代 NOT IN。
(3) 避免在索引列上使用计算。
(4)避免在索引列上使用 IS NULL 和 IS NOT NULL。
(5)对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
(6)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表描。
(7)应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。
1、 内连接(inner join):取得两张表中满足存在连接匹配关系的记录。
2、 外连接(outer join):取得两张表中满足存在连接匹配关系的记录,以及某张表(或两张表)中不满足匹配关系的记录。
3、 交叉连接(cross join):显示两张表所有记录一一对应,没有匹配关系进行筛选,也被称为:笛卡尔积。
1、 SELECT
2、 FROM
3、 JOIN
4、ON
5、 WHERE
6、 GROUP BY
7、 HAVING
8、 UNION
9、 ORDER BY
10、 LIMIT
1、 如果A表TID是自增长,并且是连续的,B表的ID为索引 select * from a,b where a.tid = b.id and a.tid>500000 limit 200;
2、 如果A表的TID不是连续的,那么就需要使用覆盖索引.TID要么是主键,要么是辅助索引,B表ID也需要有索引。 select * from b , (select tid from a limit 50000,200) a where b.id = a .tid;
(1)取前5条数据
select * from table_name limit 0,5 或 select * from table_name limit 5
(2)取第11条到第15条数据,共5条
select * from table_name limit 10,5
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。