当前位置: 首页 > news >正文

大连地区建设网站室内设计培训班排行榜

大连地区建设网站,室内设计培训班排行榜,网站申请注册 免备案,临沂网站建设首选浩瀚网络问题1#xff1a;char、varchar的区别是什么#xff1f; varchar是变长而char的长度是固定的。如果你的内容是固定大小的#xff0c;你会得到更好的性能。 问题2: TRUNCATE和DELETE的区别是什么#xff1f; DELETE命令从一个表中删除某一行#xff0c;或多行#xff0c;…问题1char、varchar的区别是什么 varchar是变长而char的长度是固定的。如果你的内容是固定大小的你会得到更好的性能。 问题2: TRUNCATE和DELETE的区别是什么 DELETE命令从一个表中删除某一行或多行TRUNCATE命令永久地从表中删除每一行。 问题3什么是触发器MySQL中都有哪些触发器 触发器是指一段代码当触发某个事件时自动执行这些代码。在MySQL数据库中有如下六种触发器 1、Before Insert 2、After Insert 3、Before Update 4、After Update 5、Before Delete 6、After Delete 问题4FLOAT和DOUBLE的区别是什么 FLOAT类型数据可以存储至多8位十进制数并在内存中占4字节。 DOUBLE类型数据可以存储至多18位十进制数并在内存中占8字节。 问题5如何在MySQL种获取当前日期 SELECT CURRENT_DATE();问题6如何查询第n高的工资 SELECT DISTINCT(salary) from employee ORDER BY salary DESC LIMIT n-1,1问题7请写出下面MySQL数据类型表达的意义int(0)、char(16)、varchar(16)、datetime、text 知识点分析 此题考察的是MySQL数据类型。MySQL数据类型属于MySQL数据库基础由此延伸出的知识点还包括如下内容 MySQL基础操作 MySQL存储引擎 MySQL锁机制 MySQL事务处理、存储过程、触发器 数据类型考点 1、整数类型包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT分别表示1字节、2字节、3字节、4字节、8字节整数。任何整数类型都可以加上UNSIGNED属性表示数据是无符号的即非负整数。长度整数类型可以被指定长度例如INT(11)表示长度为11的INT类型。长度在大多数场景是没有意义的它不会限制值的合法范围只会影响显示字符的个数而且需要和UNSIGNED ZEROFILL属性配合使用才有意义。例子假定类型设定为INT(5)属性为UNSIGNED ZEROFILL如果用户插入的数据为12的话那么数据库实际存储数据为00012。 2、实数类型包括FLOAT、DOUBLE、DECIMAL。 DECIMAL可以用于存储比BIGINT还大的整型能存储精确的小数。 而FLOAT和DOUBLE是有取值范围的并支持使用标准的浮点进行近似计算。 计算时FLOAT和DOUBLE相比DECIMAL效率更高一些DECIMAL你可以理解成是用字符串进行处理。 3、字符串类型包括VARCHAR、CHAR、TEXT、BLOB VARCHAR用于存储可变长字符串它比定长类型更节省空间。 VARCHAR使用额外1或2个字节存储字符串长度。列长度小于255字节时使用1字节表示否则使用2字节表示。 VARCHAR存储的内容超出设置的长度时内容会被截断。 CHAR是定长的根据定义的字符串长度分配足够的空间。 CHAR会根据需要使用空格进行填充方便比较。 CHAR适合存储很短的字符串或者所有值都接近同一个长度。 CHAR存储的内容超出设置的长度时内容同样会被截断。 使用策略 对于经常变更的数据来说CHAR比VARCHAR更好因为CHAR不容易产生碎片。 对于非常短的列CHAR比VARCHAR在存储空间上更有效率。 使用时要注意只分配需要的空间更长的列排序时会消耗更多内存。 尽量避免使用TEXT/BLOB类型查询时会使用临时表导致严重的性能开销。 4、枚举类型ENUM把不重复的数据存储为一个预定义的集合。 有时可以使用ENUM代替常用的字符串类型。 ENUM存储非常紧凑会把列表值压缩到一个或两个字节。 ENUM在内部存储时其实存的是整数。 尽量避免使用数字作为ENUM枚举的常量因为容易混乱。 排序是按照内部存储的整数 5、日期和时间类型尽量使用timestamp空间效率高于datetime 用整数保存时间戳通常不方便处理。 如果需要存储微妙可以使用bigint存储。 看到这里这道真题是不是就比较容易回答了。 答int(0)表示数据是INT类型长度是0、char(16)表示固定长度字符串长度为16、varchar(16)表示可变长度字符串长度为16、datetime表示时间类型、text表示字符串类型能存储大字符串最多存储65535字节数据 MySQL基础操作 常见操作 MySQL的连接和关闭mysql -u -p -h -P -u指定用户名 -p指定密码 -h主机 -P端口 进入MySQL命令行后G、c、q、s、h、d G打印结果垂直显示 c取消当前MySQL命令 q退出MySQL连接 s显示服务器状态 h帮助信息 d改变执行符 MySQL存储引擎 1、InnoDB存储引擎 默认事务型引擎最重要最广泛的存储引擎性能非常优秀。 数据存储在共享表空间可以通过配置分开。也就是多个表和索引都存储在一个表空间中可以通过配置文件改变此配置。 对主键查询的性能高于其他类型的存储引擎。 内部做了很多优化从磁盘读取数据时会自动构建hash索引插入数据时自动构建插入缓冲区。 通过一些机制和工具支持真正的热备份。 支持崩溃后的安全恢复。 支持行级锁。 支持外键。 2、MyISAM存储引擎 拥有全文索引、压缩、空间函数。 不支持事务和行级锁、不支持崩溃后的安全恢复。 表存储在两个文件MYD和MYI。 设计简单某些场景下性能很好例如获取整个表有多少条数据性能很高。 全文索引不是很常用不如使用外部的ElasticSearch或Lucene。 3、其他表引擎 Archive、Blackhole、CSV、Memory 使用策略 在大多数场景下建议使用InnoDB存储引擎。 MySQL锁机制 表锁是日常开发中的常见问题因此也是面试当中最常见的考察点当多个查询同一时刻进行数据修改时就会产生并发控制的问题。共享锁和排他锁就是读锁和写锁。 共享锁不堵塞多个用户可以同时读一个资源互不干扰。 排他锁一个写锁会阻塞其他的读锁和写锁这样可以只允许一个用户进行写入防止其他用户读取正在写入的资源。 锁的粒度 表锁系统开销最小会锁定整张表MyIsam使用表锁。 行锁最大程度的支持并发处理但是也带来了最大的锁开销InnoDB使用行锁。 MySQL事务处理 MySQL提供事务处理的表引擎也就是InnoDB。 服务器层不管理事务由下层的引擎实现所以同一个事务中使用多种引擎是不靠谱的。 需要注意在非事务表上执行事务操作MySQL不会发出提醒也不会报错。 存储过程 为以后的使用保存的一条或多条MySQL语句的集合因此也可以在存储过程中加入业务逻辑和流程。 可以在存储过程中创建表更新数据删除数据等等。 使用策略 可以通过把SQL语句封装在容易使用的单元中简化复杂的操作 可以保证数据的一致性 可以简化对变动的管理 触发器 提供给程序员和数据分析员来保证数据完整性的一种方法它是与表事件相关的特殊的存储过程。使用场景 可以通过数据库中的相关表实现级联更改。 实时监控某张表中的某个字段的更改而需要做出相应的处理。 例如可以生成某些业务的编号。 注意不要滥用否则会造成数据库及应用程序的维护困难。 大家需要牢记以上基础知识点重点是理解数据类型CHAR和VARCHAR的差异表存储引擎InnoDB和MyISAM的区别。 问题8请说明InnoDB和MyISAM的区别 InnoDB支持事务MyISAM不支持 InnoDB数据存储在共享表空间MyISAM数据存储在文件中 InnoDB支持行级锁MyISAM只支持表锁 InnoDB支持崩溃后的恢复MyISAM不支持 InnoDB支持外键MyISAM不支持 InnoDB不支持全文索引MyISAM支持全文索引 问题9innodb引擎的特性 插入缓冲insert buffer) 二次写(double write) 自适应哈希索引(ahi) 预读(read ahead) 问题10请列举3个以上表引擎 InnoDB、MyISAM、Memory 问题11请说明varchar和text的区别 varchar可指定字符数text不能指定内部存储varchar是存入的实际字符数1个字节n255或2个字节(n255)text是实际字符数2个字节。 text类型不能有默认值。 varchar可直接创建索引text创建索引要指定前多少个字符。varchar查询速度快于text,在都创建索引的情况下text的索引几乎不起作用。 查询text需要创建临时表。 问题11varchar(50)中50的含义 最多存放50个字符varchar(50)和(200)存储hello所占空间一样但后者在排序时会消耗更多内存因为order by col采用fixed_length计算col长度(memory引擎也一样)。 问题12int(20)中20的含义 是指显示字符的长度不影响内部存储只是当定义了ZEROFILL时前面补多少个 0 问题13简单描述MySQL中索引主键唯一索引联合索引的区别对数据库的性能有什么影响 知识点分析 此真题主要考察的是MySQL索引的基础和类型由此延伸出的知识点还包括如下内容 MySQL索引的创建原则 MySQL索引的注意事项 MySQL索引的原理 下面我们就来将这些知识一网打尽 索引的基础 索引类似于书籍的目录要想找到一本数的某个特定主题需要先查找书的目录定位对应的页码 存储引擎使用类似的方式进行数据查询先去索引当中找到对应的值然后根据匹配的索引找到对应的数据行。 创建索引的语法 首先创建一个表create table t1 (id int primary key,username varchar(20),password varchar(20)); 创建单个索引的语法CREATE INDEX 索引名 on 表名字段名 索引名一般是表名_字段名 给id创建索引CREATE INDEX t1_id on t1(id); 创建联合索引的语法CREATE INDEX 索引名 on 表名字段名1字段名2 给username和password创建联合索引CREATE index t1_username_password ON t1(username,password) 其中index还可以替换成uniqueprimary key分别代表唯一索引和主键索引 删除索引DROP INDEX t1_username_password ON t1 索引对性能的影响 大大减少服务器需要扫描的数据量。 帮助服务器避免排序和临时表。 将随机I/O变顺序I/O。 大大提高查询速度。 降低写的速度不良影响。 磁盘占用不良影响。 索引的使用场景 对于非常小的表大部分情况下全表扫描效率更高。 中到大型表索引非常有效。 特大型的表建立和使用索引的代价会随之增大可以使用分区技术来解决。 索引的类型 索引很多种类型是在MySQL的存储引擎实现的。 普通索引最基本的索引没有任何约束限制。 唯一索引和普通索引类似但是具有唯一性约束。 主键索引特殊的唯一索引不允许有空值。 索引的区别 -一个表只能有一个主键索引但是可以有多个唯一索引。 主键索引一定是唯一索引唯一索引不是主键索引。 主键可以与外键构成参照完整性约束防止数据不一致。 联合索引将多个列组合在一起创建索引可以覆盖多个列。也叫复合索引组合索引 外键索引只有InnoDB类型的表才可以使用外键索引保证数据的一致性、完整性、和实现级联操作基本不用。 全文索引MySQL自带的全文索引只能用于MyISAM并且只能对英文进行全文检索 基本不用 MySQL索引的创建原则 最适合创建索引的列是出现在WHERE或ON子句中的列或连接子句中的列而不是出现在SELECT关键字后的列。 索引列的基数越大数据区分度越高索引的效果越好。 对于字符串进行索引应该制定一个前缀长度可以节省大量的索引空间。 根据情况创建联合索引联合索引可以提高查询效率。 避免创建过多的索引索引会额外占用磁盘空间降低写操作效率。 主键尽可能选择较短的数据类型可以有效减少索引的磁盘占用提高查询效率。 MySQL索引的注意事项 1、联合索引遵循前缀原则 KEY(a,b,c) WHERE a  1 AND b  2 AND c  3 WHERE a  1 AND b  2 WHERE a  1 #以上SQL语句可以用到索引 WHERE b  2 AND c  3 WHERE a  1 AND c  3 #以上SQL语句用不到索引2、LIKE查询%不能在前 WHERE name LIKE %wang% #以上语句用不到索引可以用外部的ElasticSearch、Lucene等全文搜索引擎替代。3、列值为空NULL时是可以使用索引的但MySQL难以优化引用了可空列的查询,它会使索引、索引统计和值更加复杂。可空列需要更多的储存空间还需要在MySQL内部进行特殊处理。 4、如果MySQL估计使用索引比全表扫描更慢会放弃使用索引例如 表中只有100条数据左右。对于SQL语句WHERE id 1 AND id 100MySQL会优先考虑全表扫描。 5、如果关键词or前面的条件中的列有索引后面的没有所有列的索引都不会被用到。 6、列类型是字符串查询时一定要给值加引号否则索引失效例如 列name varchar(16)存储了字符串100 WHERE name 100; 以上SQL语句能搜到但无法用到索引。 MySQL索引的原理 MySQL索引是用一种叫做聚簇索引的数据结构实现的下面我们就来看一下什么是聚簇索引。 聚簇索引是一种数据存储方式它实际上是在同一个结构中保存了B树索引和数据行InnoDB表是按照聚簇索引组织的类似于Oracle的索引组织表。 注 B 树是一种树数据结构是一个n叉排序树每个节点通常有多个孩子一棵B树包含根节点、内部节点和叶子节点。根节点可能是一个叶子节点也可能是一个包含两个或两个以上孩子节点的节点。 B 树通常用于数据库和操作系统的文件系统中。NTFS, ReiserFS, NSS, XFS, JFS, ReFS 和BFS等文件系统都在使用B树作为元数据索引。B 树的特点是能够保持数据稳定有序其插入与修改拥有较稳定的对数时间复杂度。B 树元素自底向上插入。InnoDB通过主键聚簇数据如果没有定义主键会选择一个唯一的非空索引代替如果没有这样的索引会隐式定义个主键作为聚簇索引。 下图形象说明了聚簇索引表(InnoDB)和普通的堆组织表(MyISAM)的区别 最常问的MySQL面试题三——每个开发人员都应该知道 对于普通的堆组织表来说右图表数据和索引是分别存储的主键索引和二级索引存储上没有任何区别。 而对于聚簇索引表来说左图表数据是和主键一起存储的主键索引的叶结点存储行数据二级索引的叶结点存储行的主键值。 聚簇索引表最大限度地提高了I/O密集型应用的性能但它也有以下几个限制 1插入速度严重依赖于插入顺序按照主键的顺序插入是最快的方式否则将会出现页分裂严重影响性能。因此对于InnoDB表我们一般都会定义一个自增的ID列为主键。 2更新主键的代价很高因为将会导致被更新的行移动。因此对于InnoDB表我们一般定义主键为不可更新。 3二级索引访问需要两次索引查找第一次找到主键值第二次根据主键值找到行数据。 二级索引的叶节点存储的是主键值而不是行指针这是为了减少当出现行移动或数据页分裂时二级索引的维护工作但会让二级索引占用更多的空间。 解题方法 在一些MySQL索引基础考题中我们可以轻松的通过索引基础和类型来解决此类问题对于一些索引创建注意事项方面的考点我们可以通过索引创建原则和注意事项来解决。 问题14创建MySQL联合索引应该注意什么 需遵循前缀原则 问题15列值为NULL时查询是否会用到索引 在MySQL里NULL值的列也是走索引的。当然如果计划对列进行索引就要尽量避免把它设置为可空MySQL难以优化引用了可空列的查询,它会使索引、索引统计和值更加复杂。 问题16以下语句是否会应用索引SELECT FROM users WHERE YEAR(adddate) 2007;* 不会因为只要列涉及到运算MySQL就不会使用索引。 问题17MyISAM索引实现 MyISAM存储引擎使用BTree作为索引结构叶节点的data域存放的是数据记录的地址。MyISAM的索引方式也叫做非聚簇索引的之所以这么称呼是为了与InnoDB的聚簇索引区分。 问题17MyISAM索引与InnoDB索引的区别 InnoDB索引是聚簇索引MyISAM索引是非聚簇索引。 InnoDB的主键索引的叶子节点存储着行数据因此主键索引非常高效。 MyISAM索引的叶子节点存储的是行数据地址需要再寻址一次才能得到数据。 InnoDB非主键索引的叶子节点存储的是主键和其他带索引的列数据因此查询时做到覆盖索引会非常高效。 问题18以下三条sql 如何建索引只建一条怎么建 WHERE a1 AND b1 WHERE b1 WHERE b1 ORDER BY time DESC以顺序b,a,time建立联合索引CREATE INDEX table1_b_a_time ON index_test01(b,a,time)。因为最新MySQL版本会优化WHERE子句后面的列顺序以匹配联合索引顺序。 问题19有A(id,sex,par,c1,c2),B(id,age,c1,c2)两张表其中A.id与B.id关联现在要求写出一条SQL语句将B中age50的记录的c1,c2更新到A表中同一记录中的c1,c2字段中考点分析 这道题主要考察的是MySQL的关联UPDATE语句延伸考点 MySQL的关联查询语句 MySQL的关联UPDATE语句 针对刚才这道题答案可以是如下两种形式的写法 UPDATE A,B SET A.c1  B.c1, A.c2  B.c2 WHERE A.id  B.id UPDATE A INNER JOIN B ON A.idB.id SET A.c1  B.c1,A.c2B.c2 再加上B中age50的条件 UPDATE A,B set A.c1  B.c1, A.c2  B.c2 WHERE A.id  B.id and B.age  50; UPDATE A INNER JOIN B ON A.id  B.id set A.c1  B.c1,A.c2  B.c2 WHERE B.age  50 MySQL的关联查询语句 六种关联查询 交叉连接CROSS JOIN 内连接INNER JOIN 外连接LEFT JOIN/RIGHT JOIN 联合查询UNION与UNION ALL 全连接FULL JOIN 交叉连接CROSS JOIN SELECT * FROM A,B(,C)或者 SELECT * FROM A CROSS JOIN B (CROSS JOIN C) #没有任何关联条件结果是笛卡尔积结果集会很大没有意义很少使用 内连接INNER JOIN SELECT * FROM A,B WHERE A.idB.id或者 SELECT * FROM A INNER JOIN B ON A.idB.id 多表中同时符合某种条件的数据记录的集合INNER JOIN可以缩写为JOIN内连接分为三类 等值连接ON A.idB.id 不等值连接ON A.id B.id 自连接SELECT * FROM A T1 INNER JOIN A T2 ON T1.idT2.pid 外连接LEFT JOIN/RIGHT JOIN 左外连接LEFT OUTER JOIN, 以左表为主先查询出左表按照ON后的关联条件匹配右表没有匹配到的用NULL填充可以简写成LEFT JOIN 右外连接RIGHT OUTER JOIN, 以右表为主先查询出右表按照ON后的关联条件匹配左表没有匹配到的用NULL填充可以简写成RIGHT JOIN 联合查询UNION与UNION ALL SELECT * FROM A UNION SELECT * FROM B UNION ...就是把多个结果集集中在一起UNION前的结果为基准需要注意的是联合查询的列数要相等相同的记录行会合并 如果使用UNION ALL不会合并重复的记录行 效率 UNION 高于 UNION ALL 全连接FULL JOIN MySQL不支持全连接 可以使用LEFT JOIN 和UNION和RIGHT JOIN联合使用 SELECT * FROM A LEFT JOIN B ON A.idB.id UNION SELECT * FROM A RIGHT JOIN B ON A.idB.id嵌套查询 用一条SQL语句得结果作为另外一条SQL语句得条件效率不好把握 SELECT * FROM A WHERE id IN (SELECT id FROM B) 解题方法 根据考题要搞清楚表的结果和多表之间的关系根据想要的结果思考使用那种关联方式通常把要查询的列先写出来然后分析这些列都属于哪些表才考虑使用关联查询 问题20 为了记录足球比赛的结果设计表如下 team参赛队伍表 match赛程表 其中match赛程表中的hostTeamID与guestTeamID都和team表中的teamID关联查询2006-6-1到2006-7-1之间举行的所有比赛并且用以下形式列出拜仁 2:0 不莱梅 2006-6-21 首先列出需要查询的列 表team teamID teamName 表match match ID hostTeamID guestTeamID matchTime matchResult 其次列出结果列 主队 结果 客对 时间 初步写一个基础的SQL SELECT hostTeamID,matchResult,matchTime guestTeamID from match where matchTime between 2006-6-1 and 2006-7-1;通过外键联表完成最终SQL select t1.teamName,m.matchResult,t2.teamName,m.matchTime from match as m left join team as t1 on m.hostTeamID  t1.teamID, left join team t2 on m.guestTeamIDt2.guestTeamID where m.matchTime between 2006-6-1 and 2006-7-1问题21UNION与UNION ALL的区别 如果使用UNION ALL不会合并重复的记录行 效率 UNION 高于 UNION ALL 问题22一个6亿的表a一个3亿的表b通过外键tid关联你如何最快的查询出满足条件的第50000到第50200中的这200条数据记录。 1、如果A表TID是自增长,并且是连续的,B表的ID为索引 select * from a,b where a.tid  b.id and a.tid50000 limit 200;2、如果A表的TID不是连续的,那么就需要使用覆盖索引.TID要么是主键,要么是辅助索引,B表ID也需要有索引。 select * from b , (select tid from a limit 50000,200) a where b.id  a .tid;问题23拷贝表( 拷贝数据, 源表名a 目标表名b) insert into b(a, b, c) select d,e,f from a;问题24Student(S#,Sname,Sage,Ssex) 学生表 Course(C#,Cname,T#) 课程表 SC(S#,C#,score) 成绩表 Teacher(T#,Tname) 教师表 查询没学过“叶平”老师课的同学的学号、姓名 select Student.S#,Student.Sname from Student where S# not in (select distinct( SC.S#) from SC,Course,Teacher where SC.C#Course.C# and Teacher.T#Course.T# and Teacher.Tname’叶平’);问题25随机取出10条数据 SELECT * FROM users WHERE id  ((SELECT MAX(id) FROM users)-(SELECT MIN(id) FROM users)) * RAND()  (SELECT MIN(id) FROM users) LIMIT 10 #此方法效率比直接用SELECT * FROM users order by rand() LIMIT 10高很多问题26请简述项目中优化SQL语句执行效率的方法从哪些方面SQL语句性能如何分析考点分析 这道题主要考察的是查找分析SQL语句查询速度慢的方法延伸考点 优化查询过程中的数据访问 优化长难的查询语句 优化特定类型的查询语句 如何查找查询速度慢的原因 记录慢查询日志分析查询日志不要直接打开慢查询日志进行分析这样比较浪费时间和精力可以使用pt-query-digest工具进行分析 使用show profile set profiling1;开启服务器上所有执行语句会记录执行时间存到临时表中 show profiles show profile for query 临时表ID使用show status show status会返回一些计数器show global status会查看所有服务器级别的所有计数 有时根据这些计数可以推测出哪些操作代价较高或者消耗时间多 show processlist 观察是否有大量线程处于不正常的状态或特征 最常问的MySQL面试题五——每个开发人员都应该知道 使用explain 分析单条SQL语句 优化查询过程中的数据访问 访问数据太多导致查询性能下降 确定应用程序是否在检索大量超过需要的数据可能是太多行或列 确认MySQL服务器是否在分析大量不必要的数据行 避免犯如下SQL语句错误 查询不需要的数据。解决办法使用limit解决 多表关联返回全部列。解决办法指定列名 总是返回全部列。解决办法避免使用SELECT * 重复查询相同的数据。解决办法可以缓存数据下次直接读取缓存 是否在扫描额外的记录。解决办法 使用explain进行分析如果发现查询需要扫描大量的数据但只返回少数的行可以通过如下技巧去优化 使用索引覆盖扫描把所有的列都放到索引中这样存储引擎不需要回表获取对应行就可以返回结果。 改变数据库和表的结构修改数据表范式 重写SQL语句让优化器可以以更优的方式执行查询。 优化长难的查询语句 一个复杂查询还是多个简单查询 MySQL内部每秒能扫描内存中上百万行数据相比之下响应数据给客户端就要慢得多 使用尽可能小的查询是好的但是有时将一个大的查询分解为多个小的查询是很有必要的。 切分查询 将一个大的查询分为多个小的相同的查询 一次性删除1000万的数据要比一次删除1万暂停一会的方案更加损耗服务器开销。 分解关联查询让缓存的效率更高。 执行单个查询可以减少锁的竞争。 在应用层做关联更容易对数据库进行拆分。 查询效率会有大幅提升。 较少冗余记录的查询。 优化特定类型的查询语句 count(*)会忽略所有的列直接统计所有列数不要使用count(列名) MyISAM中没有任何where条件的count(*)非常快。 当有where条件时MyISAM的count统计不一定比其它引擎快。 可以使用explain查询近似值用近似值替代count(*) 增加汇总表 使用缓存 优化关联查询 确定ON或者USING子句中是否有索引。 确保GROUP BY和ORDER BY只有一个表中的列这样MySQL才有可能使用索引。 优化子查询 用关联查询替代 优化GROUP BY和DISTINCT 这两种查询据可以使用索引来优化是最有效的优化方法 关联查询中使用标识列分组的效率更高 如果不需要ORDER BY进行GROUP BY时加ORDER BY NULLMySQL不会再进行文件排序。 WITH ROLLUP超级聚合可以挪到应用程序处理 优化LIMIT分页 LIMIT偏移量大的时候查询效率较低 可以记录上次查询的最大ID下次查询时直接根据该ID来查询 优化UNION查询 UNION ALL的效率高于UNION 优化WHERE子句 解题方法 对于此类考题先说明如何定位低效SQL语句然后根据SQL语句可能低效的原因做排查先从索引着手如果索引没有问题考虑以上几个方面数据访问的问题长难查询句的问题还是一些特定类型优化的问题逐一回答。 SQL语句优化的一些方法 1.对查询进行优化应尽量避免全表扫描首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断否则将导致引擎放弃使用索引而进行全表扫描如 select id from t where num is null可以在num上设置默认值0确保表中num列没有null值然后这样查询select id from t where num3.应尽量避免在 where 子句中使用!或操作符否则引擎将放弃使用索引而进行全表扫描。 4.应尽量避免在 where 子句中使用or 来连接条件否则将导致引擎放弃使用索引而进行全表扫描如 select id from t where num10 or num20可以这样查询select id from t where num10 union all select id from t where num205.in 和 not in 也要慎用否则会导致全表扫描如 select id from t where num in(1,2,3) 对于连续的数值能用 between 就不要用 in 了select id from t where num between 1 and 36.下面的查询也将导致全表扫描select id from t where name like ‘%李%’若要提高效率可以考虑全文检索。 7. 如果在 where 子句中使用参数也会导致全表扫描。因为SQL只有在运行时才会解析局部变量但优化程序不能将访问计划的选择推迟到运行时它必须在编译时进行选择。然 而如果在编译时建立访问计划变量的值还是未知的因而无法作为索引选择的输入项。如下面语句将进行全表扫描 select id from t where numnum可以改为强制查询使用索引select id from t with(index(索引名)) where numnum8.应尽量避免在 where 子句中对字段进行表达式操作这将导致引擎放弃使用索引而进行全表扫描。如 select id from t where num/2100应改为:select id from t where num100*29.应尽量避免在where子句中对字段进行函数操作这将导致引擎放弃使用索引而进行全表扫描。如 select id from t where substring(name,1,3)’abc’ name以abc开头的id应改为: select id from t where name like ‘abc%’10.不要在 where 子句中的“”左边进行函数、算术运算或其他表达式运算否则系统将可能无法正确使用索引。 问题27简述MySQL分表操作和分区操作的工作原理分别说说分区和分表的使用场景和各自优缺点。 考点分析 分区表的原理 分库分表的原理 延伸 MySQL的复制原理及负载均衡 分区表的工作原理 对用户而言分区表是一个独立的逻辑表但是底层MySQL将其分成了多个物理子表这对用户来说是透明的每一个分区表都会使用一个独立的表文件。 如图所示MySQL将表分成多个物理字表但PHP客户端并无感知仍然认为操作的是一个表。 创建表时使用partition by子句定义每个分区存放的数据执行查询时优化器会根据分区定义过滤那些没有需要的数据的分区这样只需要查询数据所在分区即可。 这样子表相对于未分区的表来说占用空间小数据量更小因此操作速度更快。 分区的主要目的是将数据按照一个较粗的粒度分在不同的表中这样可以将相关的数据存放在一起而且如果想一次性的删除整个分区的数据也和方便。 适用场景 1、表非常大无法全部存在内存或者只在表的最后有热点数据其他都是历史数据。 2、分区表的数据更易维护可以对独立的分区进行独立的操作。 3、分区表的数据可以分布在不同的机器上从而高效适用资源。 4、可以使用分区表来避免某些特殊的瓶颈 5、可以备份和恢复独立的分区 限制 1、一个表最多只能有1024个分区 2、5.1版本中分区表表达式必须是整数5.5可以使用列分区 3、分区表字段如果有主键和唯一索引列那么主键列和唯一索引列都必须包含进来 4、分区表中无法使用外键约束 5、需要对现有表的结构进行修改 6、所有分区都必须使用相同的存储引擎 7、分区函数中可以使用的函数和表达式会有一些限制 8、某些存储引擎不支持分区 9、对于MyISAM的分区表不能使用load index into cache 10、对于MyISAM表使用分区表时需要打开更多的文件描述符 分库分表的工作原理 通过一些HASH算法或者工具实现将一张数据表垂直或者水平进行物理切分 适用场景 1、单表记录条数达到百万或千万级别时 2、解决表锁的问题 分表方式 水平分表 表很大分割后可以降低在查询时需要读的数据和索引的页数同时也降低了索引的层数提高查询次数 适用场景 1、表中的数据本身就有独立性例如表中分表记录各个地区的数据或者不同时期的数据特别是有些数据常用有些不常用。 2、需要把数据存放在多个介质上。 水平切分的缺点 1、给应用增加复杂度通常查询时需要多个表名查询所有数据都需UNION操作 2、在许多数据库应用中这种复杂度会超过它带来的优点查询时会增加读一个索引层的磁盘次数 垂直分表 把主键和一些列放在一个表然后把主键和另外的列放在另一个表中 适用场景 1、如果一个表中某些列常用另外一些列不常用 2、可以使数据行变小一个数据页能存储更多数据查询时减少I/O次数 缺点 管理冗余列查询所有数据需要join操作 分表缺点 有些分表的策略基于应用层的逻辑算法一旦逻辑算法改变整个分表逻辑都会改变扩展性较差 对于应用层来说逻辑算法增加开发成本 MySQL的复制原理及负载均衡 MySQL主从复制工作原理 在主库上把数据更高记录到二进制日志 从库将主库的日志复制到自己的中继日志 从库读取中继日志的事件将其重放到从库数据中 MySQL主从复制解决的问题 数据分布随意开始或停止复制并在不同地理位置分布数据备份 负载均衡降低单个服务器的压力 高可用和故障切换帮助应用程序避免单点失败 升级测试可以用更高版本的MySQL作为从库 解题方法 充分掌握分区分表的工作原理和适用场景在面试中此类题通常比较灵活会给一些现有公司遇到问题的场景大家可以根据分区分表MySQL复制、负载均衡的适用场景来根据情况进行回答 问:28设定网站用户数量在千万级但是活跃用户数量只有1%如何通过优化数据库提高活跃用户访问速度 可以使用MySQL的分区把活跃用户分在一个区不活跃用户分在另外一个区本身活跃用户区数据量比较少因此可以提高活跃用户访问速度。 还可以水平分表把活跃用户分在一张表不活跃用户分在另一张表可以提高活跃用户访问速度。 问题29SQL语句应该考虑哪些安全性 考点分析 SQL查询的安全方案 延伸 MySQL的其它安全设置 SQL查询的安全方案 1、使用预处理语句防止SQL注入 delete user where id  ?2、写入数据库的数据一定要进行特殊字符转义 3、查询错误信息不要返回给用户将错误记录到日志 注意 PHP端尽量使用PDO对数据库进行操作PDO拥有对预处理语句很好的支持的方法MySQLi也有但是可扩展性不如PDOMySQL函数在新版中已经趋向于淘汰所以不建议使用而且它没有很好的支持预处理方法。 1、定期做数据备份 2、不给查询用户root权限合理分配权限 3、关闭远程访问数据库权限 4、修改root口令不用默认口令使用较复杂的口令 5、删除多余的用户 6、改变root用户的名称 7、限制一般用户浏览其它库 8、限制用户对数据文件的访问权限 解题方法 通常情况下SQL安全的考点都在防SQL注入的问题因此只要遇到此类考点优先考虑SQL注入的防护手段。 问题30为什么使用mysqli和PDO连接数据库会比mysql连接数据库更安全? mysqli和PDO支持预处理可以防止SQL注入mysql不支持预处理。
http://www.pierceye.com/news/62183/

相关文章:

  • 做教务网站的需求分析公司网页制作流程图
  • 英雄联盟网站设计wordpress添加统计
  • 网站直接做标准曲线建网站公司用什么网站程序
  • 清远做网站公司iis wordpress
  • 网站被k还能不能在百度做推广门户网站维护
  • 深圳的网站建设公司排名域名ip查询入口官网
  • 网站 开发 工具网站支持ipv6做哪些改造
  • 上海网站公司珠海网站建设防
  • 兰州房地产网站建设北京网络营销定制
  • 海北高端网站建设公司上海注册公司费用
  • 网站建设网上商城展板设计用什么软件
  • 手机网站可以做公众号凡客和凡客诚品一样吗
  • 手机网站带后台源代码三门峡市住房和城乡建设局网站
  • pc网站建设的优势是什么优化是什么意思?
  • 后盾网原创实战网站建设教程1-15灯具网站模板
  • 给我一个网站2021创意网红
  • wordpress会员制网站wordpress企业建站
  • 58同城做网站的电话网销怎么销售的
  • wordpress 调用站外api无极网站网站
  • 安徽省城乡和建设厅网站微信客户管理系统
  • 福建漳州东山建设局官方网站公司取名大全最新版的
  • 专业轻电商网站建设公司福州网站快速排名提升
  • 网站建设合同定义广点通广告投放平台登录
  • 浙江平湖建设局网站阿里巴巴网站推广怎么做
  • 学校网站的建设论文各类网站推广
  • 昆明凡科建站公司公司网站高端
  • 网站建设与维护ppt模板下载品牌高端网站制作
  • 有个性的个人网站工人找活平台
  • 厦门专业网站天长网站建设天长
  • 网站建设和优化那本书好安徽安庆旅游必去十大景点