精华内容
下载资源
问答
  • 数据库优化几种常见方式

    千次阅读 2019-07-21 19:59:53
    数据库优化相关几种常见方式 一、数据库编码规范 1)从 JDBC 编程的角度讲,用 PreparedStatement 一般来说比 Statement 性能高,因为在使用 时,SQL 语句被预编译并存储在 PreparedStatement 对象中.然后可以使用 ...

    数据库优化几种常见方式

    一、数据库编码规范

    1)从 JDBC 编程的角度讲,用 PreparedStatement 一般来说比 Statement 性能高,因为在使用
    时,SQL 语句被预编译并存储在 PreparedStatement 对象中.然后可以使用
    PreparedStatement 对象多次高效地执行该语句.
    2) 有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时
    就可以去掉外键.(比喻:就好比免检产品,就是为了提高效率,充分相信产品的制造商)
    3) 表中允许适当冗余,譬如,主题帖的回复数量和最后回复时间等,将姓名和密码单独从用户
    表中独立出来等,这些都是分析了业务的特点后,对数据库中表做了优化后的解决方案.也
    就是说在有些情况下,我们设计数据库可以适度的违反三个范式的设计原则,来获得更好
    的程序性能.
    4) sql 语句全部大写,特别是列名和表名都大写.因为数据库中的语句执行机制是这样的:sql
    语句发给 oracle 服务器语法检查和编译成为内部指令缓存和执行指令.而数据库
    在对语句进行检查和编译时,会自动将 sql 语句转换成大写,并且根据 SQL 缓存的特点,不
    要拼凑条件,而是用?(占位符参数)和 PreparedStatment 来执行参数化的 sql 语句.
    5) 还有索引对查询性能的改进.当经常查询索引列中的数据时,需要在表上创建索引.索引占
    用磁盘空间,并且降低添加、删除和更新行的速度.在多数情况下,索引用于数据检索的速
    度优势大大超过它的不足之处.但是,如果应用程序非常频繁地更新数据或磁盘空间有限,
    则可能需要限制索引的数量

    二、数据库语句执行效率

    1. 用索引提高效率
    2. 选择最有效率的表名顺序(ORACLE 的解析器按照从右到左的顺序处理 FROM 子句中
      的表名,FROM 子句中写在最后的表(基础表 driving table)将被最先处理)
    3. WHERE 子句中的连接顺序:ORACLE 采用自下而上的顺序解析 WHERE 子句,根据这个
      原理,表之间的连接必须写在其他 WHERE 条件之前, 那些可以过滤掉最大数量记录的条
      件必须写在 WHERE 子句的末尾
    4. SELECT 子句中避免使用 ‘ * ‘:需要写全查询的字段列名

    提高访问效率:
    a) 避免在索引列上使用 IS NULL 和 IS NOT NULL 操作
    b) 用 UNION 替换 OR (适用于索引列)
    c) 分离表和索引
    总是将你的表和索引建立在不同的表空间内(TABLESPACES). 决不要将不属于 ORACLE 内
    部系统的对象存放到SYSTEM表空间里. 同时,确保数据表空间和索引表空间置于不同的
    硬盘上(通过指定表空间的方式可以实现这个要求).
    d) 共享 SQL 语句
    e) WHERE 子句中的连接顺序.
    示例 1.(低效,执行时间 156.3 秒)

    SELECT * FROM EMP E
    WHERE SAL > 50000
    AND JOB = ‘MANAGER' AND 25 < (SELECT COUNT(*) FROM EMP
    WHERE MGR=E.EMPNO);
    

    示例 2(高效,执行时间 10.6 秒)

    SELECT … FROM EMP E
    WHERE 25 < (SELECT COUNT(*) FROM EMP WHERE MGR=E.EMPNO)
    AND SAL > 50000
    AND JOB = ‘MANAGER';
    

    f) SELECT 子句中避免使用 ‘ * ‘
    g) 使用 DECODE 函数来减少处理时间

    例如:
    SELECT COUNT(*),SUM(SAL)
    FROM EMP
    WHERE DEPT_NO = 0020 
    AND ENAME LIKE ‘SMITH%';
    SELECT COUNT(*),SUM(SAL)
    FROM EMP
    WHERE DEPT_NO = 0030
    AND ENAME LIKE ‘SMITH%'; 
    

    你可以用 DECODE 函数高效地得到相同结果

    SELECT COUNT(DECODE(DEPT_NO,0020,'X',NULL)) D0020_COUNT,
    COUNT(DECODE(DEPT_NO,0030,'X',NULL)) D0030_COUNT,
    SUM(DECODE(DEPT_NO,0020,SAL,NULL)) D0020_SAL,
    SUM(DECODE(DEPT_NO,0030,SAL,NULL)) D0030_SAL
    FROM EMP WHERE ENAME LIKE ‘SMITH%'; 
    

    h) 用 TRUNCATE 替代 DELETE
    i) 尽量多使用 COMMIT
    j) 用 Where 子句替换 HAVING 子句

    例如:
    低效:
    SELECT REGION,AVG(LOG_SIZE)
    FROM LOCATION
    GROUP BY REGION
    HAVING REGION REGION != ‘SYDNEY' 
    AND REGION != ‘PERTH' 
    
    高效
    SELECT REGION,AVG(LOG_SIZE)
    FROM LOCATION
    WHERE REGION REGION != ‘SYDNEY'
    AND REGION != ‘PERTH'
    GROUP BY REGION
    

    (注意: HAVING 中的条件一般用于对一些集合函数的比较,如 COUNT( ) 等等. 除此而外,
    一般的条件应该写在 WHERE 子句中)
    k) 用 EXISTS 替代 IN

    低效:
    SELECT *
    FROM EMP (基础表)
    WHERE EMPNO > 0
    AND DEPTNO IN (SELECT DEPTNO
    FROM DEPT
    WHERE LOC = ‘MELB')
    高效:
    SELECT *
    FROM EMP (基础表)
    WHERE EMPNO > 0
    AND EXISTS (SELECT ‘X'
    FROM DEPT
    WHERE DEPT.DEPTNO = EMP.DEPTNO
    AND LOC = ‘MELB') 
    

    l) 用 NOT EXISTS 替代 NOT IN

    例如:
    SELECT …
    FROM EMP
    WHERE DEPT_NO NOT IN (SELECT DEPT_NO
    FROM DEPT
    WHERE DEPT_CAT='A'); 
    为了提高效率.改写为:
    (方法一: 高效,左外连接)
    SELECT ….
    FROM EMP A,DEPT B
    WHERE A.DEPT_NO = B.DEPT(+)
    AND B.DEPT_NO IS NULL
    AND B.DEPT_CAT(+) = ‘A'
    (方法二: 最高效)
    SELECT ….
    FROM EMP E
    WHERE NOT EXISTS (SELECT ‘X'
    FROM DEPT D
    WHERE D.DEPT_NO = E.DEPT_NO
    AND DEPT_CAT = ‘A');
    
    展开全文
  • MySQL数据库优化几种方式

    万次阅读 2018-08-07 20:28:13
    分享一下常见的几种MySQL数据优化方式。。。。。。。 选取最适合的字段属性 1、MySQL可以很好的支持数据量的很大的存取,但是一般说来,数据库中的表越小其查询的速度就也快。所以,可以在建表的时候,为了获取更好...

    分享一下常见的几种MySQL数据优化方式。。。。。。。

    • 选取最适合的字段属性

    1、MySQL可以很好的支持数据量的很大的存取,但是一般说来,数据库中的表越小其查询的速度就也快。所以,可以在建表的时候,为了获取更好的性能,将表中的字段长度设的尽可能的小。

    2、尽可能的把字段设置成NOT NULL,这样在执行查询的时候,数据库不用去比较NULL值。

    3、对于部分的文本字段,例如“性别”或者“民族”,我们就可以用enum来定义。MySQL会把enum类型的数据当作数值型来处理,而数值型数据被处理起来的速度要比文本类型快的多。这样我们就可以提高数据库的性能。

    • 使用连接(JOIN)来代替子查询是(sub-Queries

    MySQL从4.1开始就支持SQL的子查询。这个技术可以使用select语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。

    例:将客户基本信息表中没有任何订单的客户删除掉

    DELETE FROM customerinfo WHERE CustomerID NOT IN (SELECT CustomerID FROM salesinfo)

    利用子查询先从销售信息表中将所有发出订单的客户ID取出,然后将结果传递给主查询。使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作,同时也可以避免事务或者表锁死,并且写起来也很容易。但是,在某些情况下,子查询可以被更有效率的连接(JOIN)替代。

    例:将所有没有订单记录的用户取出来

    SELECT * FROM customerinfo WHERE CustomerID NOT IN (SELECTC ustomerID FROM salesinfo)

    如果使用连接(JOIN)来完成这个查询工作,速度将会很快。尤其是当salesinfo表中对CustomerID建有索引的话,性能将会更好:

    SELECT * FROM customerinfo LEFT JOIN salesinfo ON customerinfo.CustomerID = salesinfo.CustomerID WHERE salesinfo.CustomerID ISNULL

    连接(JOIN)之所以更有效率一些,是因为MySQL不需要在内存中创建临时表来完成这个逻辑上的需求两个步骤的查询工作。

    • 使用联合(union)来代替手动创建的临时表

    Union查询可以把需要使用临时表的两条或者更多的select查询合并成一个查询中。在客户端的查询会话结束的时候,临时表会被自动删除,从而保证数据库的整齐、高效。使用union来创建查询的时候,只需要用union作为关键字把多个select语句连接起来就可以了(所有的select语句中的字段数目相同)

    SELECT Name,Phone FROM client UNION

    SELECT Name,BirthDate FROM author UNION

    SELECT Name,Supplier FROM product

    • 事务

    尽管我们可以使用子查询(Sub-Queries)、连接(JOIN)和联合(UNION)来创建各种各样的查询,但不是所有的数据库操作都可以只用一条或少数几条SQL语句就可以完成的。更多的时候是需要用到一系列的语句来完成某种工作。但是在这种情况下,当这个语句块中的某一条语句运行出错的时候,整个语句块的操作就会变得不确定起来。设想一下,要把某个数据同时插入两个相关联的表中,可能会出现这样的情况:第一个表中成功更新后,数据库突然出现意外状况,造成第二个表中的操作没有完成,这样,就会造成数据的不完整,甚至会破坏数据库中的数据。要避免这种情况,就应该使用事务,它的作用是:要么语句块中每条语句都操作成功,要么都失败。换句话说,就是可以保持数据库中数据的一致性和完整性。事物以BEGIN关键字开始,COMMIT关键字结束。在这之间的一条SQL操作失败,那么,ROLLBACK命令就可以把数据库恢复到BEGIN开始之前的状态。

    BEGIN; INSERT INTO salesinfo SET CustomerID=14; UPDATE inventory SET Quantity=11 WHERE item='book'; COMMIT;

    事务的另一个重要作用是当多个用户同时使用相同的数据源时,它可以利用锁定数据库的方法来为用户提供一种安全的访问方式,这样可以保证用户的操作不被其它的用户所干扰。

    • 锁定表

    尽管事务是维护数据库完整性的一个非常好的方法,但却因为它的独立性,有时会影响数据库的性能,尤其是在很大的应用系统中,由于在事务执行的过程中,数据库将会被锁定,因此其它的用户请求只能暂时等待直到该事务结束。如果一个数据库系统只有少数几个用户来使用,事务造成的影响不会成为一个太大的问题;但假设有成千上万的用户同时访问一个数据库系统,就会产生比较严重的相应延迟。其实,有些情况下可以通过锁定表的方法来获得更好的性能。

    LOCK TABLE inventory WRITE SELECT Quantity FROM inventory WHERE Item='book';

    ...

    UPDATE inventory SET Quantity=11 WHERE Item='book'; UNLOCKTABLES

    这里,我们用一个select语句取出初始数据,通过一些计算,用update语句将新值更新到表中。包含有WRITE关键字的LOCKTABLE语句可以保证在UNLOCKTABLES命令被执行之前,不会有其它的访问来对inventory进行插入、更新或者删除的操作。

    • 使用外键

    锁定表的方法可以维护数据的完整性,但是它却不能保证数据的关联性。这个时候就可以使用外键。

    例如,外键可以保证每一条销售记录都指向某一个存在的客户。外键可以把customerinfo表中的CustomerID映射到salesinfo表中的CustomerID,任何的一条没有合法CustomerID的记录都不会被更新或者插入到salesinfo中。

    CREATE TABLE customerinfo( CustomerIDINT NOT

    NULL,PRIMARYKEY(CustomerID))TYPE=INNODB;

    CREATE TABLE salesinfo( SalesIDNT NOT NULL,CustomerIDINT NOT NULL, PRIMARYKEY(CustomerID,SalesID),

    FOREIGNKEY(CustomerID) REFERENCES customerinfo(CustomerID) ON DELETE CASCADE)TYPE=INNODB;

    注意例子中的参数“ON DELETE CASCADE”。该参数保证当customerinfo表中的一条客户记录被删除的时候,salesinfo表中所有与该客户相关的记录也会被自动删除。如果要在MySQL中使用外键,一定要记住在创建表的时候将表的类型定义为事务安全表InnoDB类型。该类型不是MySQL表的默认类型。定义的方法是在CREATETABLE语句中加上TYPE=INNODB

    • 使用索引

    索引是提高数据库性能的常用方法,它可以令数据库服务器以比没有索引快得多的速度检索特定的行,尤其是在查询语句当中包含有MAX(),MIN()和ORDERBY这些命令的时候,性能提高更为明显。

    一般说来,索引应建立在那些将用于JOIN,WHERE判断和ORDERBY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引。对于一个ENUM类型的字段来说,出现大量重复值是很有可能的情况

    例如customerinfo中的“province”..字段,在这样的字段上建立索引将不会有什么帮助;相反,还有可能降低数据库的性能。我们在创建表的时候可以同时创建合适的索引,也可以使用ALTERTABLE或CREATEINDEX在以后创建索引。此外,MySQL从版本3.23.23开始支持全文索引和搜索。全文索引在MySQL中是一个FULLTEXT类型索引,但仅能用于MyISAM类型的表。对于一个大的数据库,将数据装载到一个没有FULLTEXT索引的表中,然后再使用ALTERTABLE或CREATEINDEX创建索引,将是非常快的。但如果将数据装载到一个已经有FULLTEXT索引的表中,执行过程将会非常慢。

    • 优化查询语句

    绝大多数的情况下,使用索引可以提高查询的速度,但是SQL语句使用不恰当的话,索引将无法发挥它应有的作用。

    1. 在相同类型的字段间进行比较的操作。
    2. 在建有索引的字段上尽量不要使用函数进行操作。

    例如:在一个date类型的字段上使用yeae()函数时,将会使索引不能发挥应有的作用。

         3.在搜索字符型字段时,我们有时会使用like关键字和通配符,这种做法虽然简单,但却也是以牺牲系统性能为代价的。后者的查询速度明显比前者快得多。

        SELECT * FROM books WHERE name like"MySQL%"

        SELECT * FROM books WHERE name="MySQL" andname "MySQM"

        最后,应该注意避免在查询中让MySQL进行自动类型转换,因为转换过程也会使索引变得不起作用。

    展开全文
  • 数据库优化的八种方式

    千次阅读 2020-07-24 22:23:40
    在mysql数据中,表越小,数据库执行的效率就越高,所以我们在创建表的时候,为了获取更好的性能,我们就要将字段的宽度设置的尽可能的小。例如,在写电话号码这个字段的时候,我们使用CHAR(255),或者vachar类型,...

    1.选取最适用的字段属性

    在mysql数据中,表越小,数据库执行的效率就越高,所以我们在创建表的时候,为了获取更好的性能,我们就要将字段的宽度设置的尽可能的小。例如,在写电话号码这个字段的时候,我们使用CHAR(255),或者vachar类型,都会给数据库增加不必要的空间,我们可以用CHAR(11)就可以了,不会造成不必要的空间浪费。对于某些文本字段,例如性别,我们可以把它定义为ENUM类型,因为在mysql中,ENUM类型会被当作数据类型来处理,而数值类型数据被处理起来速度比文本类型快得多。另一个提高效率方法就是在可能的情况下,应该尽量把字段设置为NOT NULL,这样在执行查询的时候,数据库就不用去比较null值。

    2使用连接查询(join)代替子查询(Sub-queries)

    mysql在4.1开始就支持sql的子查询,我们可以查询某个列的信息,然后将查询结果作为过滤条件作用在另一个查询中。例如,我们想要将客户基本信息表中没有任何订单的客户删除,可以就可以先查询出全部客户信息的id,然后将结果传递给主查询。

    delete from customerinfo 
    where customId not in (select customId from salesinfo)
    

    使用子查询可以完成很多逻辑上需要多个步骤才能完成sql操作,同时也可以避免事务或者表锁死,并且写起来容易。但是有些情况下,子查询可以被更有效率的连接查询(join)代替。例如我们要将所有没有订单的用户取出来,可以用下面的查询完成:

    select * from customerinfo 
    where customId not in (select customId from salesinfo)
    

    但是,如果我们使用连接查询(join)查询的时候,速度会快很多,尤其是当salesinfo表中对customId存在索引的情况下,性能会更好,查询语句如下:

    select * from customerinfo 
    left join salesinfo on customerinfo.customId = salesinfo.customId
    where salesinfo.customId isnull;
    

    连接查询(join)的效率更快的原因是mysql并不需要在内存中创建临时表来完成这个逻辑上需要两个步骤的查询工作。

    3.使用联合查询(union)来代替手动创建临时表

    mysql在4.0开始支持联合(union)查询,可以把需要使用临时表的两条或者更多的select查询合并到一个查询中。在客户端完成查询之后,临时表会自动删除,从而保证数据库的高效和整齐。使用union来创建查询的时候,我们只需要用union关键字把多个select语句连接起来就可以了,注意:所有的select语句中的字段数目要相同。

    select name,phone from client union
    select name,birthData from author union
    select name,supplier from product;
    

    4.事务

    尽管我们可以使用连接查询,联合查询和子查询来创建一系列的查询,但是并不是所有的数据库操作都可以只用一条或少数几条sql语句就可以完成,更多的时候是需要用到一系列的语句来完成操作。在这种情况下,如果某条语句出现错误的情况下,整个语句块的操作就会变得不确定,这时候,我们就需要使用事务,事务的四大性质即原子性、隔离性、一致性和持久性能够保证数据库的一致性和完整性。

    5.锁定表

    使用事务虽然可以很好的维持数据库的完整性,但却因为他独占整个数据库,有时也会严重影响数据库的性能,尤其是在很大的应用系统中。此时,我们可以通过锁定表的方式来获取更高的性能。

    LOCK TABLE inventory WRITE SELECT Quantity FROM inventory WHERE Item='book';
    ...
    UPDATE inventory SET Quantity=11 WHERE Item='book'; UNLOCKTABLES
    

    6.使用外键

    锁定表的方法可以维护数据的完整性,但是却不能保证数据的关联性,这个时候我们就可以使用外键。

    CREATE    TABLE    customerinfo( CustomerIDINT    NOT    NULL,PRIMARYKEY(CustomerID))TYPE=INNODB;
    CREATE    TABLE    salesinfo( SalesIDNT    NOT    NULL,CustomerIDINT    NOT    NULL,
    PRIMARYKEY(CustomerID,SalesID),
    FOREIGNKEY(CustomerID)    REFERENCES    customerinfo(CustomerID)    ON    DELETE    CASCADE)TYPE=INNODB;
    

    7.使用索引

    索引是提高数据库性能的常用方法,它可以另数据库服务器以比没有创建索引快得多的速度检索特定的行,尤其是当语句中包含max()、min()和order by这些命令的时候,性能提升的更加明显。
    一般来说,索引应该建立在哪些将用于join、where判断和order by排序的字段上,尽量不要对数据库的某个含有大量重复的值的字段建立索引,对于ENUM类型的字段来说,出现大量重复的值的可能性非常大

    8.优化的查询语句

    绝大多数情况下,使用索引可以提高查询速度,但如果sql语句使用不恰当,索引将无法发挥应有的作用。下面是应该注意的几个事项:
    首先,最好是在相同类型的字段间进行比较的操作。
    其次,再建有索引的字段上尽量不要使用函数进行操作。
    第三,再搜索字符型字段时,我们有时会使用like关键字和通配符,这种做法虽然简单,但却是以牺牲系统性能作为代价的。
    例如:

    select * from books where name like ”mysql%“
    

    可以用

    select * from books where 
    name>= "mysql" and name<"mysqm"
    

    来代替,性能会高很多。
    最后,应该避免查询让mysql进行自动类型转换,因为转换过程也会使索引失效。

    展开全文
  • 数据库和sql优化几种方式

    千次阅读 2019-04-16 14:15:47
    数据库和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.数据库锁了解吗?介绍下悲观和乐观锁。代码层面最简单的乐观锁使用。 数据库引擎了解吗?数据库的行级锁和表级锁了解吗?

    展开全文
  • 优化SQLServer数据库的50方法
  • MySQL数据库优化的八种方式(经典必看)

    万次阅读 多人点赞 2019-03-13 15:48:28
    MySQL数据库优化的八种方式(经典必看) 引言: 关于数据库优化,网上有不少资料和方法,但是不少质量参差不齐,有些总结的不够到位,内容冗杂 偶尔发现了这篇文章,总结得很经典,文章流量也很大,所以拿...
  • SQL Server数据库优化几种方法.

    千次阅读 2014-06-26 09:49:59
    巧妙优化SQL Server数据库几种方法,在实际操作中导致查询速度慢的原因有很多,其中最为常见有以下的几种:没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)。  I/O吞吐量小,形成了瓶颈...
  • 数据库SQL调优的几种方式

    万次阅读 多人点赞 2018-07-23 08:54:57
    在项目中,SQL的调优对项目的性能来讲至关重要,所有掌握常见的SQL调优方式是必不可少的,下面介绍几种常见的SQL的调优方式,供借鉴. 创建索引 在经常需要进行检索的字段上创建索引,比如要按照表字段username进行...
  • 优化MySQL数据库性能的八方法, 1、选取最适用的字段属性 2、使用连接(JOIN)来代替子查询(Sub-Queries) 3、使用联合(UNION)来代替手动创建的临时表
  • SQL数据库优化的六方法

    千次阅读 2019-06-24 10:17:15
    SQL数据库优化的六方法 SQL命令因为语法简单、操作高效受到了很多用户的欢迎。但是,SQL命令的效率受到不同的数据库功能的限制,特别是在计算时间方面,再加上语言的高效率也不意味着优化会更容易,所以每个...
  • 面试题:数据库优化的方法

    千次阅读 2019-09-16 09:42:14
    数据库满足数据库的三大范式可以避免数据冗余。 简单来说三句话: 1NF、列不可分; 2NF、非主键列完全依赖主键,不存在部分依赖; 3NF、非主键列必须直接依赖主键,不存在传递依赖。 第一范式(1NF):强调的...
  • Oracle 数据库性能优化的主要方法
  • 数据库连接的几种方式

    千次阅读 2016-10-19 15:18:05
    ODBC(Open Database Connectivity,开放数据库互连)是微软公司开放服务结构(WOSA,Windows Open Services Architecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序...
  • 索引优化数据库的8方法

    千次阅读 2019-12-05 17:19:25
    所以我们在数据库设计时不要让字段的默认值为NULL。 4、使用短索引 对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对...
  • 面试不再尬聊的Mysql数据库优化方案

    万次阅读 多人点赞 2020-03-23 11:41:10
    数据库优化是一个老生常谈的问题,刚入门的小白或者工作N年的光头对这个问题应该都不陌生,你要面试一个中高级工程师那么他就想"哥俩好"一样那么粘,面试官肯定会问这个问题,这篇文章我们就和它哥俩好!而且这个...
  • Oracle数据库优化的方法

    千次阅读 2018-05-26 22:54:30
    Oracle数据库优化的方法1、减少访问数据库的次数。2、不要让数据库做得太多。(1)SELECT子句中避免使用' * ':ORACLE在解析的过程中,会将' * '依次转换成所有的列名, 这个工作是通过查询数据字典完成的,这意味着...
  • JDBC是java访问数据库的基础,其余的mybatis和JDO 以及Hibernate 都是把jdbc封装起来,因此了解JDBC连接数据库的原理十分重要!! 准备工作 1. mysql的jar包 导入到lib目录下 ... 五种方式如下: /** * @a...
  • 数据库备份的几种方式的详细步骤

    万次阅读 2019-07-10 21:30:26
    *数据库备份的几种方式的详细步骤 如何冷备?? 1.保证2台机器上软件版本一致,最好安装版本也一致 A:原机 B:恢复机 对于原机: 2.将mysql数据库关闭 service mysqld stop 3.scp 拷贝到要进行恢复的机器上 scp -r...
  • 面试求职:数据库常见面试题(数据库优化思路)

    万次阅读 多人点赞 2018-08-06 22:52:04
    数据库表中对储存数据对象予以唯一和完整标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null)。 超 键: 在关系中能唯一标识元组的属性集称为关系模式的超键。一个...
  • 数据库性能优化的五方案

    万次阅读 2018-07-30 08:54:07
    关系型数据库在互联网项目中应用极为广泛,今天小编就和大家分享几个数据库优化几种方案: 建立索引 数据库优化第一步就是建立合理的索引,这也是最初级的优化,也是DBA常用的优化方案!MySql索引类型有:普通...
  • oracle数据库优化总结

    万次阅读 2018-07-11 16:35:03
    1. 数据库优化基本知识I/O 数据库的基本作用就是实现对数据的管理与查询。随之而来的就是大量的IO操作, 在海量数据的情况下,数据库的性能问题有80%以上和IO有关。优化ORACLE数据库的I/O性能一般有两个方面,一是...
  • MySql数据库优化可以从哪个方面进行?

    万次阅读 多人点赞 2017-05-01 23:44:37
    1、数据库优化可以从以下个方面进行:2、项目中,优化mysql之前,首先要开启慢查询日志,在分析慢查询日志.1,查看所有日志状态: show variables like '%quer%';2,查看慢查询状态:show variables like 'show%...
  • 数据库迁移的几种方式(Oracle版)

    千次阅读 2019-07-31 10:48:02
    但是对于数据库迁移我们常用的方式方法都有那些了,今天我就和大家一起来说说关于oracle数据迁移的几种方式方法: 方法一、exp/imp逻辑备份与恢复(常规备份): 它是oracle最常用最简单的方法,一般是基于应用的owner...
  • Android 性能优化之数据库优化(一)

    千次阅读 2016-09-12 10:26:41
    Android 性能优化之数据库优化(一)
  • 数据库优化相关面试题

    万次阅读 2019-01-05 10:51:07
    数据库优化,包括合理的事务隔离级别、SQL语句优化、索引的优化 使用缓存,尽量减少数据库 IO 分布式数据库、分布式缓存 服务器的负载均衡   2、实践中如何优化MySQL 四条从效果上第一条影响最大,后面...
  • 常见的数据库优化方法

    千次阅读 2019-04-19 03:48:05
    主要可以通过以下几种方式数据库进行优化: 性能优化 表的设计合理化,符合三大范式(3NF) 1NF是对属性的原子性约束,要求属性(列)具有原子性,不可再分解;(只要是关系型数据库都满足1NF) 2NF是对记录的...
  • 数据库优化一般思路(个人经验之谈)

    万次阅读 多人点赞 2017-10-17 10:38:54
    随着系统规模的不断增加,数据量和并发量不断增大,整个系统架构中最先受到冲击而形成瓶颈的,定然是数据库,因此数据库层面的优化,是一个程序员不可或缺的技能,以下是我在使用数据库中的一些心得,有不足之处,还...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 399,145
精华内容 159,658
关键字:

数据库优化的几种方式