精华内容
下载资源
问答
  • ThinkPHP 有哪些特性

    千次阅读 2018-04-14 11:10:09
    视图模型:轻松动态地创建数据库视图,多表查询不再烦恼。 关联模型:让你以出乎意料的简单、灵活的方式完成多表的关联操作。 模板引擎:系统内建了一款卓越的基于XML的编译型模板引擎,支持两种类型的模板...
    高级模型:可以轻松支持序列化字段、文本字段、只读字段、延迟写入、乐观锁、数据分表等高级特性。

     视图模型:轻松动态地创建数据库视图,多表查询不再烦恼。

     关联模型:让你以出乎意料的简单、灵活的方式完成多表的关联操作。

     模板引擎:系统内建了一款卓越的基于XML的编译型模板引擎,支持两种类型的模板标签,融合了Smarty和JSP标签库的思想,支持标签库扩展。通过驱动还可以支持Smarty、EaseTemplate、TemplateLite、Smart等第三方模板引擎。

     缓存机制:系统支持包括文件方式、APC、Db、Memcache、Shmop、Eaccelerator和Xcache在内的多种动态数据缓存类型,以及可定制的静态缓存规则,并提供了快捷方法进行存取操作。

     类库导入:ThinkPHP是首先采用基于类库包和命名空间的方式导入类库,让类库导入看起来更加简单清晰,而且还支持冲突检测和别名导入。为了方便项目的跨平台移植,系统还可以严格检查加载文件的大小写。


     扩展机制:系统支持包括类库扩展、驱动扩展、应用扩展、模型扩展、控制器扩展、标签库扩展、模板引擎扩展、Widget扩展、行为扩展和模式扩展在内的强大灵活的扩展机制,让你不再受限于核心的不足和无所适从,随心DIY自己的框架和扩展应用。

     URL模式:系统支持普通模式、PATHINFO模式、REWRITE模式和兼容模式的URL方式,支持不同的服务器和运行模式的部署,配合URL路由功能,让你随心所欲的构建需要的URL地址和进行SEO优化工作。

     编译机制:独创的核心编译和项目的动态编译机制,有效减少OOP开发中文件加载的性能开销。ALLINONE模式更是让你体验飞一般的感觉。

     ORM:简洁轻巧的ORM实现,配合简单的CURD以及AR模式,让开发效率无处不在。

     查询语言:内建丰富的查询机制,包括组合查询、复合查询、区间查询、统计查询、定位查询、动态查询和原生查询,让你的数据查询简洁高效。

     动态模型:无需创建任何对应的模型类,轻松完成CURD操作,支持多种模型之间的动态切换,让你领略数据操作的无比畅快和最佳体验。

     分组模块:不用担心大项目的分工协调和部署问题,分组模块帮你解决跨项目的难题。

     AJAX支持:内置AJAX数据返回方法,支持JSON、XML和EVAL格式返回客户端,并且系统不绑定任何AJAX类库,可随意使用自己熟悉的AJAX类库进行操作。

     多语言支持:系统支持语言包功能,项目和模块都可以有单独的语言包,并且可以自动检测浏览器语言自动载入对应的语言包。

     模式扩展:除了标准模式外,系统内置了Lite、Thin和Cli模式,针对不同级别的应用开发提供最佳核心框架,还可以自定义模式扩展。

     自动验证和完成:自动完成表单数据的验证和过滤,生成安全的数据对象。

     字段类型检测:字段类型强制转换,确保数据写入和查询更安全。

     数据库特性:系统支持多数据库连接和动态切换机制,支持分布式数据库。犹如企业开发的一把利刃,跨数据库应用和分布式支持从此无忧。
    展开全文
  • 文章目录事务事务的ACID(acid)特性事务特性直观明了的总结事务的创建和使用视图基本概念视图的基本使用使用视图的好处索引索引优势索引劣势索引分类索引相关命令语句四种方式来添加数据表的索引:mysql索引结构哪些...

    此文章为个人学习时所总结
    有问题还请评论 留言~
    支持的请点个赞或收藏~

    事务

    事务的ACID(acid)特性

    1. 原子性(Atomicity)

          原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

    2. 一致性( Consistency)
          事务必须使数据库从一个一致性状态 变换到另外一个 一致性状态
    3. 隔离性( Isolation )
          事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰

    4. 持久性( Durability)
          持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响

    事务特性直观明了的总结

    原子性(Atomicity): 一个事务不可再分割,要么都执行要么都不执行
    一致性( Consistency): 一个事务执行会使数据从一个 一致状态切换到另外一个 一致状态
    隔离性( Isolation ): 一个事务的执行不受其他事务的干扰
    持久性( Durability): 一个事务一旦提交,则会永久的改变数据库的数据.

    事务的创建和使用

    隐式事务:事务没有明显的开启和结束的标记

    比如 insert、update、delete语句

    delete from 表 where id =x ;

    显式事务: 事务具有明显的开启和结束的标记

    前提: 必须先设置自动提交功能为禁用

    SHOW VARIABLES LIKE “auto%” 执行后可查看到事务默认为自动提交的

    set autocommit=0; 关闭事务自动提交,只对当前事务生效一次,不是永久关闭

    SET AUTOCOMMIT=1 开启自动提交

    事务使用的步骤

    步骤 1. 关闭自动提交事务
    set autocommit=0;
    start transaction;  (可选的)
    
    步骤 2.编写事务中的sql语句(select  insert  update  delete)
    语句1;
    语句2;
    ...
    
    步骤 3.结束事务
    commit;    提交事务
    rollback;  回滚事务
    

    开启事务的语句:

    update 表 set 用户1余额=500 where name='用户1':
    

    结束事务的语句

    update 表 set 用户2余额=1500 where name = '用户2';
    

    事务使用步骤例子

    #建表语句
    DROP TABLE IF EXISTS account;
    
    CREATE TABLE accout(
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(20),
    balance DOUBLE
    );
    
    INSERT INTO accout (username, balance)
    VALUES
      ('admin',1500),('tizi',3000);
    
    #同时全部执行以下sql语句
    
    #关闭自动提交事务
    SET autocommit=0;
    0START TRANSACTION;
    #编写一组事务的语句
    UPDATE accout SET balance= 1000 WHERE username='admin';
    UPDATE accout SET balance=1200 WHERE username='tizi';
    #结束事务
    COMMIT;
    
    SELECT * FROM accout;
    
    #添加数据 体验事务的回滚
    INSERT INTO accout (username, balance)
    VALUES
      ('test1',1500),('test2',3000);
    #指定保存点,保存点名为back
    SAVEPOINT insert;
    
    #可再次添加多数据 等会数据表数据可直接回滚到back的保存点的状态
    INSERT INTO accout (username, balance)
    VALUES
      ('test13',1500),('test14',3000),('test15',3000);
    
    SAVEPOINT back;
    #回滚到back的保存点中,可看到保存点之后所有insert的数据都已没有
    ROLLBACK TO SAVEPOINT back;
    

    视图

    基本概念

    视图是一个虚拟表,是sql的查询结果,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据,在使用视图时动态生成。视图的数据变化会影响到基表,基表的数据变化也会影响到视图[insert update delete ] ; 创建视图需要create view 权限,并且对于查询涉及的列有select权限;使用create or replace 或者 alter修改视图,那么还需要改视图的drop权限。

    CREATE VIEW v1
    AS
    SELECT s.name,s.pos FROM class c 
    INNER JOIN staffs s 
    ON c.`id` = s.`id`;
    
    SELECT * FROM v1 WHERE NAME LIKE "%1";
    

    视图的基本使用

    ​ 如何创建视图(基本语法)

    create view 视图名 as select 字段名 from 表名;

    在这里插入图片描述

    Mysql视图的定义在from关键字后面不能包含子查询

    ​ 修改了视图,对基表数据有影响

    在这里插入图片描述

    ​ 修改了基表,对视图也有影响

    如何修改视图

    基本语法

    alter view 视图名 as select 语句;

    alter view 视图名 as select 视图;

    在这里插入图片描述

    显示视图创建情况

    show create view 视图名;

    查看视图

    Show tables;

    Show table status [ from db_name ] [ like ‘pattern’ ]****;

    SELECT * FROM information_schema.views where table_name = ‘my_view’;

    删除视图

    drop view 视图名[,视图名…];

    重命名视图

    Rename table 视图名 to 新视图名;;

    使用视图的好处

    1、安全。一些数据表有着重要的信息。有些字段是保密的,不能让用户直接看到。这时就可以创建一个视图, 在这张视图中只保留一部分字段。这样,用户就可以查询自己需要的字段,不能查看保密的字段。
    2、性能。关系数据库的数据常常会分表存储,使用外键建立这些表的之间关系。这时,数据库查询通常会用到连接(JOIN) 。这样做不但麻烦,效率相对也比较低。如果建立一个视图,将相关的表和字段组合在一起,就可以避免使用JOIN查询数据。
    3、灵活。如果系统中有一张旧的表,这张表由于设计的问题,即将被废弃。然而,很多应用都是基于这张表,不易修改。这时就可以建立一张视图,视图中的数据直接映射到新建的表。这样,就可以少做很多改动,也达到了升级数据表的目的。

    视图详解参考链接: https://www.cnblogs.com/cshaptx4869/p/10481749.html

    索引

    索引(Index)是帮助mysql高效获取数据的数据结构,可以得到索引的本质,索引是数据结构.
    排好序的快速查找数据结构.
    数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,
    这样就可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引 .BTREE、

    索引优势

    类似于大学图书馆建书目索引,提高数据检索的效率,降低数据库的io成本
    通过索引对数据库进行排序,降低数据排序的成本,降低了cpu的消耗

    索引劣势

    1、实际上索引页是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以也是要占用内存空间的
    2、虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行insert、update、delete

    3、因为更新表时,mysql不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会
    新带来的键值变化后的索引信息。

    4、索引只是提高效率的一个因素,如果mysql有大数据量的表,就要花时间研究建立最优秀的索引,或优化查询

    索引分类

    单值索引:一个索引只为一个列或者字段建立的索引叫做单值索引
    唯一索引:通常每个表的主键为该表的唯一索引,允许有空值
    复合索引:为多个列建立的索引称为复合索引

    索引相关命令语句

    创建索引

    CREATE [UNIQUE] INDEX indexName ON mytable(columnname(length),....);
    
    ALTER table tablename ADD [UNIQUE] INDEX [indexName] ON (columnname(length));
    

    创建举例

    CREATE INDEX bname ON books(bookname,detail);
    
    ALTER TABLE test ADD INDEX idx_address(address)
    

    删除索引

    DROP INDEX [indexName] ON mytable;
    

    查看索引

    SHOW INDEX FROM table_name   #尾加上\G后,cmd的形式操作会以行的形式展现
    

    四种方式来添加数据表的索引:

    ALTER TABLE tbl_ name ADD PRIMARY KEY (column_ list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL
    
    ALTER TABLE tbl_ name ADD UNIQUE index_ _name (column_ list). 这条语句创建索引的值必须是唯一的(除了NULL外,NULL 可能会出现多次)
    
    ALTER TABLE tbl name ADD INDEX index_ name (column_ list): 添加普通索引,索引值可出现多次
    
    ALTER TABLE tbl_ name ADD FULLTEXT index_ name (column_ lst):该语句指定 了索引为FULLTEXT,用于全文索引
    

    mysql索引结构

    *BTree索引:

    检索原理:

    在这里插入图片描述

    [初始化介绍]
    一棵b树, 浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示),
    如磁盘块1包含数据项17和35,包含指针P1、P2、P3,
    P1表示小于17的磁盘块,P2表示在17和35之间的磁盘块,P3表示大于35的磁盘块。
    真实的数据存在于叶子节点即3、5、9、10、13、15、 28、29、 36、60、 75、79、90、 99。
    非叶子节点只不存储真实的数据,只存储指引搜索方向的数据项,如17、35并不真实存在于数据表中。

    [查找过程]
    如果要查找数据项29,那么首先会把磁盘块1由磁盘加载到内存,此时发生一次I0,在内存中用二分查找确定29在17和35之间,锁定磁盘块1的P2指针,内存时间因为非常短(相比磁盘的I0)可以忽略不计,通过磁盘块1的P2指针的磁盘地址把磁盘块3由磁盘加载到内存,发生第二次I0,29在26和30之间,锁定磁盘块3的P2指针,通过指针加载磁盘块8到内存,发生第三次I口,同时内存中做二分查找找到29,结束查询,总计三次I0。

    真实的情况是,3层的b+树可以表示上百万的数据,如果上百万的数据查找只需要三次I0,性能提高将是巨大的,如果没有索引,每个数据项都要发生一次IO,那么总共需要百万次的IQ,显然成本非常非常高。

    做全栈开发只需了解btree即可,以下三种索引可不掌握

    Hash索引
    full-text全文索引
    R-Tree索引

    哪些情况需要创建索引

    1. 主键自动建立唯一索引
    2. 频繁作为查询条件的字段应该创建索引
    3. 查询中与其他表关联的字段,外键关系建立索引
    4. 频繁更新的字段不建立索引,因每次更新不单单是更新了记录还会更新索引
    5. where条件里用不到的字段不创建索引
    6. 单键/组合索引的选择问题,who?(在高并发下倾向创建组合索引)
    7. 查询中排序的字段,排序字段若通过索引去访问将大大提高排序效率
    8. 查询中统计或者分组字段

    哪些情况不要创建索引

    1. 表记录太少
    2. 经常增删改查的表。提高了查询速度,同时会降低更新表的速度,如对表进行insert、update、delete 更新表时,mysql不仅要保存数据,还要保存索引文件
    3. 某个数据列包含许多重复的内容,为他建立索引没有太大的实际效果

    性能调优三步走:优化器、看瓶颈、Explain

    Explain详解*

    使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈

    在日常工作中,我们会有时会开慢查询去记录一些执行时间比较久的SQL语句,找出这些SQL语句并不意味着完事了,些时我们常常用到explain这个命令来查看一个这些SQL语句的执行计划,查看该SQL语句有没有使用上了索引,有没有做全表扫描,这都可以通过explain命令来查看。所以我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。

    Explain能干嘛

    • 表的读取顺序
    • 数据读取操作的操作类型
    • 哪些索引可以使用
    • 那些索引被实际使用
    • 表之间的引用
    • 每张表有多少行被优化器查询

    Explain用法

    explain+SQL语句即可

    -- 实际SQL,查找用户名为Jefabc的员工
    select * from emp where name = 'Jefabc';
    -- 查看SQL是否使用索引,前面加上explain即可,explain相当于sql的体检报告单
    explain select * from emp where name = 'Jefabc';
    

    explain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra

    EXPTION查询概要描述

    id: 选择标识符
    select_type: 表示查询的类型。
    table: 输出结果集的表
    partitions: 匹配的分区
    type: 表示表的连接类型
    possible_keys: 表示查询时,可能使用的索引
    key: 表示实际使用的索引
    key_len: 索引字段的长度
    ref: 列与索引的比较
    rows: 扫描出的行数(估算的行数)
    filtered: 按表条件过滤的行百分比
    Extra: 执行情况的描述和说明

    下面对这些EXPTION查询出的字段进行详细解释

    一、 id

    SELECT识别符。这是SELECT的查询序列号

    我的理解是SQL执行的顺序的标识,SQL从大到小的执行

    1. id相同时,执行顺序由上至下
      在这里插入图片描述

    2. 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
      在这里插入图片描述

    3. id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行
      在这里插入图片描述

    -- 查看在研发部并且名字以Jef开头的员工,经典查询
    explain select e.no, e.name from emp e left join dept d on e.dept_no = d.no where e.name like 'Jef%' and d.name = '研发部';
    

    二、select_type

    示查询中每个select子句的类型

    (1) SIMPLE(简单SELECT,不使用UNION或子查询等)

    (2) PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)

    (3) UNION(UNION中的第二个或后面的SELECT语句)

    (4) DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)

    (5) UNION RESULT(UNION的结果,union语句中第二个select开始后面所有select)

    (6) SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)

    (7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,依赖于外部查询)

    (8) DERIVED(派生表的SELECT, FROM子句的子查询)

    (9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行)

    三、table

    显示这一步所访问数据库中表名称(显示这一行的数据是关于哪张表的),有时不是真实的表名字,可能是简称,例如上面的e,d,也可能是第几步执行的结果的简称

    四、type

    对表访问类型排列,表示MySQL在表中找到所需行的方式,又称“访问类型”。

    常用的类型有(从最好到最差依次排列):

    **system > const > eq_ref > ref >r ange > index > ALL **

    system:表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计

    const:表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快,如将主键置于where列表中,MySQL就能将该查询转换为一个常量

    eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描

    ref: 非唯一性索引扫描,返回匹配某个单独值的所有行本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找封多个符合条件的行,所以他应该属于查找和扫描的混合体

    range: 只检索给定范围的行,使用一个索引来选择行

    index: Full Index Scan,index与ALL区别为index类型只遍历索引树

    ALL:Full Table Scan, MySQL将遍历全表以找到匹配的行

    NULL: MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成。

    一般来说,得保证查询至少达到range级别.最好能达到ref

    五、possible_keys

    指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null)

    该列完全独立于EXPLAIN输出所示的表的次序。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用。
    如果该列是NULL,则没有相关的索引。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能。如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询

    六、Key

    key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中,如为null,则没有使用索引

    如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。

    七、key_len

    表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)

    不损失精确性的情况下,长度越短越好

    八、ref

    列与索引的比较,显示索引的哪一列被使用了,是一个常数,即哪些列或常量被用于查找索引列上的值

    九、rows

    估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数

    rows用的越少越好

    十、Extra

    该列包含MySQL解决查询的详细信息,有以下几种情况:

    Using filesort*(九死一生):说明mysql会对数据适用一个外部的索引排序。而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成排序操作称为“文件排序”
    Using temporary*:(十死无生) 使用了临时表保存中间结果,mysql在查询结果排序时使用临时表。常见于排序order by和分组查询group by。
    Using index*(ok): 表示相应的select操作用使用覆盖索引,避免访问了表的数据行,效率不错。如果同时出现using where,表明索引被用来执行索引键值的查找;如果没有同时出现using

    -- 测试Extra的filesort
    explain select * from emp order by name;
    

    Using join buffer:使用了连接缓存。改值强调了在获取连接条件时没有使用索引,并且需要连接缓冲区来存储中间结果。如果出现了这个值,那应该注意,根据查询的具体情况可能需要添加索引来改进能。

    Impossible where:这个值强调了where语句会导致没有符合条件的行(通过收集统计信息不可能存在结果)。

    Select tables optimized away:这个值意味着仅通过使用索引,优化器可能仅从聚合函数结果中返回一行

    No tables used:Query语句中使用from dual 或不含任何from子句

    -- explain select now() from dual;
    

    Explain详解表格形式展现

    信息 描述
    id 查询的序号,包含一组数字,表示查询中执行select子句或操作表的顺序
    两种情况
    id相同,执行顺序从上往下
    id不同,id值越大,优先级越高,越先执行
    select_type 查询类型,主要用于区别普通查询,联合查询,子查询等的复杂查询
    1、simple ——简单的select查询,查询中不包含子查询或者UNION
    2、primary ——查询中若包含任何复杂的子部分,最外层查询被标记
    3、subquery——在select或where列表中包含了子查询
    4、derived——在from列表中包含的子查询被标记为derived(衍生),MySQL会递归执行这些子查询,把结果放到临时表中
    5、union——如果第二个select出现在UNION之后,则被标记为UNION,如果union包含在from子句的子查询中,外层select被标记为derived
    6、union result:UNION 的结果
    table 输出的行所引用的表
    type 显示联结类型,显示查询使用了何种类型,按照从最佳到最坏类型排序
    1、system:表中仅有一行(=系统表)这是const联结类型的一个特例。
    2、const:表示通过索引一次就找到,const用于比较primary key或者unique索引。因为只匹配一行数据,所以如果将主键置于where列表中,mysql能将该查询转换为一个常量
    3、eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于唯一索引或者主键扫描
    4、ref:非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行,可能会找多个符合条件的行,属于查找和扫描的混合体
    5、range:只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引,一般就是where语句中出现了between,in等范围的查询。这种范围扫描索引扫描比全表扫描要好,因为它开始于索引的某一个点,而结束另一个点,不用全表扫描
    6、index:index 与all区别为index类型只遍历索引树。通常比all快,因为索引文件比数据文件小很多。
    7、all:遍历全表以找到匹配的行
    注意:一般保证查询至少达到range级别,最好能达到ref。
    possible_keys 指出MySQL能使用哪个索引在该表中找到行
    key 显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。查询中如果使用覆盖索引,则该索引和查询的select字段重叠。
    key_len 表示索引中使用的字节数,该列计算查询中使用的索引的长度在不损失精度的情况下,长度越短越好。如果键是NULL,则长度为NULL。该字段显示为索引字段的最大可能长度,并非实际使用长度。
    ref 列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
    rows 根据表统计信息以及索引选用情况,大致估算出找到所需的记录所需要读取的行数
    Extra 包含不适合在其他列中显示,但是十分重要的额外信息
    1、Using filesort:说明mysql会对数据适用一个外部的索引排序。而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成排序操作称为“文件排序”
    2、Using temporary:使用了临时表保存中间结果,mysql在查询结果排序时使用临时表。常见于排序order by和分组查询group by。
    3、Using index:表示相应的select操作用使用覆盖索引,避免访问了表的数据行。如果同时出现using where,表明索引被用来执行索引键值的查找;如果没有同时出现using where,表名索引用来读取数据而非执行查询动作。
    4、Using where :表明使用where过滤
    5、using join buffer:使用了连接缓存
    6、impossible where:where子句的值总是false,不能用来获取任何元组
    7、select tables optimized away:在没有group by子句的情况下,基于索引优化Min、max操作或者对于MyISAM存储引擎优化count(*),不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。
    8、distinct:优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作。

    总结:

    • EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况
    • EXPLAIN不考虑各种Cache• EXPLAIN不能显示MySQL在执行查询时所作的优化工作
    • 部分统计信息是估算的,并非精确值
    • EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。

    索引优化

    单表优化

    CREATE TABLE IF NOT EXISTS article(
    id INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
    author_id INT(10) UNSIGNED NOT NULL,
    category_id INT(10) UNSIGNED NOT NULL,
    views INT(10) UNSIGNED NOT NULL,
    comments INT(10) UNSIGNED NOT NULL,
    title VARBINARY(255) NOT NULL,
    content TEXT NOT NULL
    );
    INSERT INTO article(author_id,category_id,views,comments,title,content) 
    VALUES
    (1,1,1,1,'1','1'),
    (2,2,2,2,'2','2'),
    (3,3,1,3,'3','3');
    
    SELECT * FROM article;
    

    优化案例

    #单表优化 `atricle` 表
    
    #需求:查询category_id为1且comments大于1的情况下,views最多的article_id,查询后分析sql
    
    EXPLAIN SELECT * FROM `article` WHERE category_id =1 AND comments>1 ORDER BY views DESC LIMIT 1;
    
    
    #结论:很显然,type是ALL即最坏的情况。Extra 里还出现了Using filesor,也是最坏的情况。优化是必须的。
    
    
    SHOW INDEX FROM article;
    
    #开始优化
    #1.1新建索引+删除索引
    ALTER TABLE article ADD	INDEX idx_article_ccv(category_id,comments,views);
    CREATE INDEX idx_article_ccv ON `atricle`(category_id,comments,views);
    
    SHOW INDEX FROM `article`
    
    #此时 type全表扫面已经解决,但是extra还有问题 using filesort 说明mysql会对数据适用一个外部的索引排序。而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成排序操作称为“文件排序
    EXPLAIN SELECT * FROM `article` WHERE category_id =1 AND comments>1 ORDER BY views DESC LIMIT 1;
    #尽量提出=1的范围查询 不然后面的会失效
    EXPLAIN SELECT * FROM `article` WHERE category_id =1 AND comments=1 ORDER BY views DESC LIMIT 1;
    
    #正确解决方法,删除最开始创建的索引
    DROP INDEX idx_acricle_ccv ON `article`;
    #修改后的索引
    CREATE INDEX idx_article_cv ON article(category_id,views)
    
    #既不出现全表扫描,mysql无法利用索引对后面的views部分进行检索,即range类型查找后面的字段失效
    SHOW INDEX FROM `article`
    #此时完美解决
    EXPLAIN SELECT * FROM `article` WHERE category_id =1 AND comments>1 ORDER BY views DESC LIMIT 1;
    
    
    

    两表优化

    CREATE TABLE IF NOT EXISTS class(
    id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    card INT(10) UNSIGNED NOT NULL,
    PRIMARY KEY(id)
    );
    
    CREATE TABLE IF NOT EXISTS book(
    bookid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    card INT(10) UNSIGNED NOT NULL,
    PRIMARY KEY (bookid)
    );
    
    #建议20条
    INSERT INTO class(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO class(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO class(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO class(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO class(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO class(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO class(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO class(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO class(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO class(card) VALUES(FLOOR(1+(RAND()*20)));
    
    
    INSERT INTO book(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO book(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO book(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO book(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO book(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO book(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO book(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO book(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO book(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO book(card) VALUES(FLOOR(1+(RAND()*20)));
    
    

    优化案例

    #两表优化 `book` 和 `class`表
    SELECT * FROM book,class WHERE book.`card`=class.`card`;
    SELECT * FROM class INNER JOIN book ON class.`card`=book.`card`;
    
    #结论 type为all  全表扫面
    EXPLAIN SELECT * FROM class LEFT JOIN book ON class.`card`=book.`card`;
    
    #试着给book表建立一个索引,此时book表的type正常
    ALTER TABLE book ADD INDEX idx_book(card);
    DROP INDEX idx_book ON book;
    
    #试着给class表建立一个索引,此时class表的type为index。比book表的状态更好
    #由于左连接的特性决定的,left join条件用于确定如何从右表搜索行,左边一定都有
    #所以右编是我们的关键点,一定需要建立索引
    ALTER TABLE class ADD INDEX idx_class(card);
    DROP INDEX idx_class ON class;
    
    SHOW INDEX FROM book;
    SHOW INDEX FROM class;
    
    ALTER TABLE book ADD INDEX idx_book(card);
    
    #试着将left join改为right join 查看效果,建立索引
    
    

    三表优化

    CREATE TABLE IF NOT EXISTS phone(
    phoneid INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    card INT(10) UNSIGNED NOT NULL,
    PRIMARY KEY(phoneid)
    )ENGINE=INNODB;
    
    #建议20条
    INSERT INTO phone(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO phone(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO phone(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO phone(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO phone(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO phone(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO phone(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO phone(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO phone(card) VALUES(FLOOR(1+(RAND()*20)));
    INSERT INTO phone(card) VALUES(FLOOR(1+(RAND()*20)));
    
    SELECT * FROM phone;
    

    优化案例

    #三表优化 `book` `class` `phone`表
    ALTER TABLE phone ADD INDEX idx_phone(card);
    
    #sql实例
    SELECT * FROM class LEFT JOIN book ON class.`card`=book.`card` LEFT JOIN `phone` ON book.`card` = phone.`card`;
    
    #分析sql
    EXPLAIN	SELECT * FROM class LEFT JOIN book ON class.`card`=book.`card` LEFT JOIN `phone` ON book.`card` = phone.`card`;
    
    #type为ref表示优化很好,效果不错,因此索引最好设置在需要经常查询的字段中
    
    #结论
    #join语句的优化
    
    #尽可能的减少join语句中的NestedLoop的循环总次数:“永远用小结果集驱动大的结果集”
    #优先优化NestedLoop的内层循环
    #保证join语句中被驱动表上join条件字段被索引且内存资源充足的前提下,不要太吝惜joinBuffer的设置
    

    如何避免索引失效

    CREATE TABLE staffs(
    id INT PRIMARY KEY AUTO_INCREMENT,
    NAME VARCHAR(24) NOT NULL DEFAULT '' COMMENT'姓名',
    age INT NOT NULL DEFAULT 0 COMMENT '年龄',
    pos VARCHAR(20) NOT NULL DEFAULT '' COMMENT'职位',
    add_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT'入职时间'
    )CHARSET utf8 COMMENT '员工记录表';
    
    insert into staffs(name,age,pos,add_time) values('zhi1',20,'manger',now());
    insert into staffs(name,age,pos,add_time) values('zhi2',23,'dev',now());
    insert into staffs(name,age,pos,add_time) values('zhi3',22,'dev',now());
    
    SELECT * FROM staffs;
    
    ALTER TABLE staffs ADD idx_staffs_nameAgePos(NAME,age,pos);
    
    SHOW INDEX FROM staffs;
    
    #避免索引失效
    SHOW INDEX FROM staffs;
    
    ALTER TABLE staffs ADD idx_staffs_nameAgePos(NAME,age,pos);
    
    EXPLAIN SELECT * FROM staffs WHERE NAME='zhi2'
    EXPLAIN SELECT * FROM staffs WHERE NAME='zhi1' AND age =20;
    EXPLAIN SELECT * FROM staffs WHERE NAME='zhi1' AND age =20 AND pos='manger';
    
    
    #索引失效
    EXPLAIN SELECT * FROM staffs WHERE age=23 AND pos='dev';
    EXPLAIN SELECT * FROM staffs WHERE pos='dev';
    
    #最左前缀法则,除去name外,其他两个索引全失效。因为建立的索引第一个字段不能丢失,相当于一个火车头,没有头,后面的怎么跑?有头后后面的车厢链接运行
    EXPLAIN SELECT * FROM staffs WHERE NAME="zhi3"
    
    #虽然引用到了索引,但只用到了一部分,三个索引中,中间的未使用
    EXPLAIN SELECT * FROM staffs WHERE NAME="zhi3" AND pos="dev";
    
    #最左前缀法则:1.索引带头大哥不能si 2.中间兄弟不能断
    

    避免索引失效方法总结

    1. 全值匹配查询我最爱

    2. 最左前缀法则:如果索引了多列,要遵守最左前缀法则,指的是查询 从索引的 最左前列开始并且 不跳过索引中间的列 简单了解就是 1.索引带头大哥不能si 2.中间兄弟不能断

    3. 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描

    4. 存储引擎不能使用索引中范围条件右边的列

    5. 尽量使用覆盖索引(脂肪纹索引的查询(索引列和查询列一致)),减少select *

      EXPLAIN SELECT NAME,age,pos FROM staffs WHERE NAME=“zhi3” AND age>20 AND pos=“dev”;

    6. 使用不等于( !=或者< 和 >)的时候无法使用索引会导致全表扫描

    7. is null,is not null 无法使用索引

    8. like以通配符开头(‘%abc…’)mysql索引失效会变成全表扫描的操作。%abc%全表扫描。abc%这样才会避免索引失效,但结果有问题

      问题:解决like ‘%字符%’ 索引不被使用的方法覆盖索引

      create index idx_user_nameAage on table(name,age);

      select 字段 from table; #索引不会失效

      select * from table; #索引会失效

    9. 字符串不加引号索引会失效

    10. 少用or,用它来连接时索引会失效

    索引总结

    1. 复合索引的使用一定是从建立索引时列的顺序开始,1,2,3…排序,使用时1不能少,第一位索引没有,则后面索引失效,或者第一位索引存在,后面紧接第三位索引,通常从第一位索引后开始索引失效,最好的状态是三个使用都能够使用到,也就是能够全职匹配

    2. 不允许在索引列上做任何的函数或者类型转换操作,否则会导致索引失效

    3. 尽量避免在sql中使用范围查找,如使用范围查找极大可能会导致,范围查找后的缩小失效

    4. 尽量使用覆盖索引,什么是覆盖索引呢,也就是在select 后面的查询列尽量和建立的索引列一致,查询列只能比索引列少,不能多,一旦查询列比索引列多,则无法使用覆盖索引

    5. mysql在使用了 != 或者<> 后索引容易失效

    6. mysql使用 is null 或者 is not null 也会导致索引失效

    7. mysql的sql查询中,字符串数据不加单引号索引也会失效,上面已经提到过了,索引列不允许做函数和数据类型转换,字符串不加单引号虽然也可以使用,那是因为mysql在底层为你做了数据类型转换

    8. like 以 “%123” 通配符开头的sql,like后面的索引将会失效,而如果%不放在第一位,比如"123%",索引失效的概率较小.

    9. 少用or,用它来连接时索引为失效

    表连接时,索引的使用情况

    1. 当两张表使用左连接时,索引应该尽量建立在右边中,因为左连接左边的表示必须全部显示出来的,也就是说左边的表必须是全表扫描,所以左连接索引最好建立在右边中,反之右连接也是如此

    2. 多表连接的话,有左连接永远先加右边的索引

    group by 和 order by 索引排序

            如果对某一个列进行排序或者分组,且排序或者分组的不是第一位索引,那么第一位的索引需要出现在where后面,且不能是范围查询,这样排序或者分组的索引才能够生效,单独使用某一个索引进行排序极大可能会出现失效的情况

    mysql索引总结可参考链接:https://blog.csdn.net/weixin_42214548/article/details/80981168.

    感谢参考,总结全文不易,点个赞支持下呗,您的支持是我最大的动力 !

    展开全文
  • Navicat for SQL Server 是一个全面的图形化方式管理数据库,可进行创建、编辑和删除全部数据库对象,例如表、视图、函数、索引和触发器,或运行 SQL查询和脚本,查看或编辑 BLOBs、HEX、ER 图表的数据,显示表的...

    Navicat for SQL Server 是一个全面的图形化方式管理数据库,可进行创建、编辑和删除全部数据库对象,例如表、视图、函数、索引和触发器,或运行 SQL查询和脚本,查看或编辑 BLOBs、HEX、ER 图表的数据,显示表的关系。

    建立图形关联式数据库、从 ODBC 导入数据、同步不同 SQL Server 之间的数据、批处理作业计划、设定用户和访问权限,Navicat for SQL Server 是齐全的图形化管理器。连接到任何本机或远程的SQL Server,Navicat for SQL Server 与 SQL Server 2000、2005、2008、2008R2、2012、2014和SQL Azure兼容。

    Navicat for SQL Server 主要功能如下:

    Navicat Cloud

    Navicat 提供 Navicat Cloud 服务给用户,同步连接设置、模型、查询和虚拟组到云。这样就能随时随地实时访问。有了 Navicat Cloud,便可以善用一天中的每分每秒,最大限度提高工作效率。

    安全连接

    Navicat 通过 SSH 通道创建安全的 SSH 阶段作业,确保两台主机之间的连接受到强大验证和安全加密的保护,验证方式可使用密码、公钥、私钥。

    对象设计器

    Navicat对象设计器
    Navicat for SQL Server 对象设计器

    使用专业的对象设计器创建、修改和设计所有数据库对象,例如:表、视图、函数、索引、和触发器。无需编写复杂的 SQL 来创建和编辑对象。

    表查看器

    Navicat查看网格或表单
    Navicat for SQL Server 查看网格或表单

    查看网格或表单:使用网格查看添加、修改和删除记录。用类似数据表的功能浏览网格查看,例如排序和隐藏数据组,使用 Navicat for SQL Server 助理编辑器:备注、十六进制、图像或更多。也可以用表单查看操作记录。清楚显示记录的栏位名和其值,不必担心误解数据。

    Navicat选择外键数据
    Navicat for SQL Server 选择外键数据

    选择外键数据:使用外键关系选定参考查找表,并自动建立下拉列表。无需持续对照参考主表,简化工作流程和提升效率。

    SQL 创建工具或编辑器

    Navicat SQL 创建工具
    Navicat SQL 创建工具

    SQL 创建工具:视觉化 SQL 创建工具创建和编辑查询或视图,不必担心语法和正确命令的用法。选择需要在表中执行的操作,自动编写 SQL 语句。

    Navicat 自动完成代码
    Navicat 自动完成代码

    自动完成代码:使用自动完成代码功能,能快速地在 SQL 编辑器中创建 SQL 语句。无论选择数据库对象的属性或 SQL 关键字,只需从下拉列表中选择。

    数据库设计器

    Navicat 逆向工程
    Navicat 逆向工程

    逆向工程:使用 Navicat 逆向工程,可以从一个现有的数据库创建数据库模型,可视化地显现和编辑数据库结构或创建一个图形模型,并由模型生成一个数据库。

    Navicat 正向工程和生成脚本
    Navicat 正向工程和生成脚本

    正向工程和生成脚本:同步到数据库功能可充分了解所有数据库的差异,生成必要的同步脚本来更新目标数据库,并使其与模型相同。导出 SQL 有机会全面控制最终的 SQL 脚本,生成参照完整性规则,生成模型的独立部份、注释、字符集等,可大大节省工作时间。

    数据处理工具

    导入或导出向导:从不同格式的文件导入数据到表,例如 Access、Excel、XML、TXT、CSV、JSON 及更多。而且在设置数据源连接后,可以从 ODBC 导入数据。只需简单地选择需要导入的表,或使用添加查询按钮指定查询。同样可以将数据导出到各种格式,如 Excel、TXT、CSV、DBF、XML 等。

    Navicat 数据传输
    Navicat 数据传输

    数据传输:在多个数据库间轻松地传输数据,可以选择指定的 SQL 格式和编码导出数据为 SQL 文件,这个功能可大大的简化迁移数据的进程。

    Navicat 数据或结构同步
    Navicat 数据或结构同步

    数据或结构同步:从一个数据库中详细的分析进程传输数据到另外一个数据库,同样可以对比并修改表的结构。在数据和结构同步中,目标数据库可以在源服务器,也可以在其他的服务器。

    Navicat 备份或还原
    Navicat 备份或还原

    备份或还原:定期备份数据库对用户涞水相当重要,备份或还原全部表、记录、视图等。如果数据损坏,不用再重做,让你能高枕无忧。

    Navicat 批处理作业
    Navicat 批处理作业

    计划:不同数据库的设置文件可以创建在单一批处理作业,这样就可以设置计划并在指定的时间运行。批处理作业可以创建的对象包括打印报表、查询、数据传输、数据 同步、导入和导出。而且可传送电子邮件通知给指定的收件人,获取最新的计划信息。此外导出的文件或打印的报表可以添加到批处理作业作为电子邮件附件,轻易与其他人共享数据。

    报表创建工具或查看器 只限于 Windows 版本

    Navicat 报表创建工具
    Navicat 报表创建工具

    使用用户友好 GUI 报表创建工具创建各种不同类型的报表,设计发票、统计、邮寄标签及更多其他报表。输出报表到多种格式,如 text、PDF、Lotus、Excel、Graphic、Html 及更多。Navicat Report Viewer 可浏览由报表创建工具设计的报表,最酷的是可以与没有安装 Navicat 但安装了 Navicat Report Viewer 的计算机共享报表。

    实用工具

    Navicat ER 图表
    Navicat ER 图表

    ER 图表:ER 图表能通过图形格式显示数据库结构,帮助用户了解数据库,看到数据库中表之间的关联。

    Navicat 连接颜色或虚拟组
    Navicat 连接颜色或虚拟组

    连接颜色或虚拟组:连接颜色功能可立刻知道连接到哪个服务器,显示在子窗口工具栏的颜色指示,用于识别连接和它们的数据库对象。虚拟组工具可将对象分类到不用的组,令对象和连接有一个更好的组织。

    Navicat 树或对象筛选功能
    Navicat 树或对象筛选功能

    树或对象筛选:使用树或对象筛选功能可设计显示数据对象的列表,简单地需输入文本,就只显示符合指定字符串的数据库对象。

    收藏夹

    Navicat for SQL Server 可帮助用户容易地回到经常访问的数据库对象,通过添加路径到收藏列表,只需一次点击就可以打开这些数据库对象。

    以上为转载内容,原文是:http://www.formysql.com/jiqiao/SQL-Server.html

    转载于:https://www.cnblogs.com/Navicat/p/5395109.html

    展开全文
  • 网上收集出来的,部分内容可能问题。需要自己分析哪些为正确的,不过大部分没问题!。 【1】方式: ...可以查询存储过程的脚本: ...可以查询表名,视图名,存储过程名等 select *
     
    
    网上收集出来的,部分内容有可能有问题。需要自己分析哪些为正确的,不过大部分没问题!。


    【1】方式:

    可以查询存储过程的脚本:
    select * from syscomments

    可以查询表名,视图名,存储过程名等
    select * from sysobjects 
    --where xtype='U' --表名
    --where xtype='V' --视图名
    --where xtype='PK' --主键
    --where xtype='P' --存储过程

    【2】方式:

    1.获取所有数据库名: 

       (1)Select Name FROM Master..SysDatabases order by Name 
    2.
    获取所有表名
       (1)Select Name FROM SysObjects Where XType=''U'' orDER BY Name 
               XType=''U'':
    表示所有用户表
               XType=''S'':
    表示所有系统表;

       (2)SELECT name FROM sysobjects WHERE type = ''U'' AND sysstat = ''83''

               注意:一般情况只需要type = ''U'',但有时候会有系统表混在其中(不知道什么原因),加上后面一句后就能删除这些系统表了


    3.
    获取所有字段名: 
    (1)
    Select Name FROM SysColumns Where id=Object_Id(''TableName'')

    (2)SELECT syscolumns.name,systypes.name,syscolumns.isnullable,syscolumns.length FROM syscolumns, systypes WHERE syscolumns.xusertype = systypes.xusertype AND "syscolumns.id = object_id(''tableName'')

           注意点:
         
    a)这里为了重点突出某些重要内容,选取了其中几项信息输出。
         
    bsyscolumns表中只含有数据类型编号,要获取完整的名字需要从systypes表中找,一般用户使用的数据类型用xusertype对应比较好,不会出现一对多的情况。
         
    csyscolumns.length得到的是物理内存的长度,所以nvarcharvarchar等类型在数据库中的显示是这个的一半。

    4、得到表中主键所包含的列名:

        SELECT syscolumns.name FROM syscolumns,sysobjects,sysindexes,sysindexkeys WHERE syscolumns.id = object_id(''tablename'') AND sysobjects.xtype = ''PK'' AND sysobjects.parent_obj = syscolumns.id AND sysindexes.id = syscolumns.id AND sysobjects.name = sysindexes.name AND sysindexkeys.id = syscolumns.id AND sysindexkeys.indid = sysindexes.indid AND syscolumns.colid = sysindexkeys.colid

    注意:这是在4张系统表中寻找的,关系比较复杂,大致可以表示为:
    syscolumns
    中存有表中的列信息和表idsysobjects表中存有主键名字(即PK_Table类似)和表idsysindexes中存 有主键名字和表idindex编号,sysindexkeys中存有表idindex编号和列编号,一项一项对应起来后就能找到列名了。

     

    获取存储过程也可以使用:

    EXEC sp_helptext @objname='GuestComplaintsAndNetCommentReport'

    EXEC sp_helptext 'GuestComplaintsAndNetCommentReport'

    根据名称获取存储过程内容的例子:

    select * from syscomments
    select * from sysobjects
    where  xtype='P'

    SELECT sobj.id,sobj.name,comment.text
    from syscomments AS comment
    INNER JOIN sysobjects AS sobj
    ON sobj.id = comment.id
    where sobj.xtype = 'P'
    AND comment.id = '11147085'

     获取表列名操作:

    SELECT * FROM sysobjects
    WHERE name = 'ProductsType'

    SELECT * FROM syscolumns
    WHERE id = '1538104520'

     

    展开全文
  • MySQL数据库查询优化

    2019-01-22 14:53:57
    从而明白在MySQL中怎么写与视图相关的查询语句才能好的效果? 什么是等价谓词重写?MySQL中怎么写WHERE子句有利于提高查询效率? 预计时间1小时 第6课 查询优化技术理论与MySQL实践(四)------条件化简 什么是...
  • 在优化器进行查询转换的时候,如果将内嵌视图里推入...在10g和11g里面,Oracle的处理方式有哪些不同? 问题分析 为了解答以上问题,首先需要对SQL的基本语法与查询转换(QueryTransformation)的概念与原理有一定了解。
  • 3,千万级,亿级数据查询慢,什么优化办法? 4,聚集索引,非聚集索引的区别是什么?怎么用?什么场合用? 5,常用的集合类是哪些哪些效率高?效率高的原因是什么? 6,权限管理,具体到增删改查,你...
  • 有哪些事件?事件key以及参数是什么?什么时候触发?是否同步触发? 3-5 beforeenter, enter, afterenter的使用方式(github源码贴图) 事件驱动样例:视图进入时查询呈现、视图离开时重置视图 3-5 事件驱动的扩展...
  • string判断空怎么判断,区别 string,stringbuffer区别 list,map用的多吗,hashmap线程安全吗,怎么保证hashmap安全 hashmap底层 异常处理方式,有没有自己try ...Oracle有哪些连接查询 表,视图,存储过程的创建 ...
  • 1,模型仅仅是通知视图,模型发生了改变,至于具体发生了哪些改变并没有告诉视图,需要视图在得到通知后,根据自己的兴趣点去主动查询模型中的相关数据。 2,模型在通知视图时同时携带改通知相关的数据(这些数据...
  • 现在程序存储数据方式有哪些2.这两种存储方式有什么缺点数据库1.概念2.数据库的分类数据库管理系统MySQL简介数据查询,DML操作约束,事务权限管理,视图SQL语言分类 引言 1.现在程序存储数据方式有哪些 java程序...
  •  对于客户机,EntityBean是一种持久性对象,它代表一个存储在持久性存储器中的实体的对象视图,或是一个由现有企业应用程序实现的实体。  Session Bean 还可以再细分为 Stateful Session Bean 与 Stateless ...
  • 7、索引类型有哪些? 8、什么是事务?什么是锁? 9、什么叫视图?游标是什么? 10、视图的优缺点 11、列举几种表连接方式,有什么区别? 12、主键和外键的区别? 13、在数据库中查询语句速度很慢,如...
  • Mysql Information_schema

    2011-01-05 12:09:55
    Mysql的INFORMATION_SCHEMA数据库包含了一些表和视图,提供了访问数据库元数据的方式,这台MySQL服务器上,到底有哪些数据库、各个数据库有哪些表,每张表的字段类型是什么,各个数据库要什么权限才能访问,等等信息...
  • 数据库系统概论三

    2018-11-23 17:46:57
    1、SQL语言的特点 1、综合统一。...2、SQL语言的数据查询,数据定义,数据操纵功能,这些分别有哪些SQL语句? 1、数据定义:定义数据库中的基本对象、模式(架构)定义、表定义、视图和索引。 ...
  • 31、合并查询有哪些? 51 32、SQL语句执行顺序 51 33、null的含义 52 34、mysql分页 52 35、MySQL、SqlServer、oracle写出字符存储、字符串转时间 52 36、update语句可以修改结果集中的数据吗? 53 37、oracle如何...
  • 关于二方库版本号的命名方式,下列哪些说法符合《阿里巴巴Java开发手册》:ABCD A .版本号命名格式:主版本号.次版本号.修订号。 B .主版本号:产品方向改变,或者大规模API不兼容,或者架构不兼容升级。 C .次...
  • 1.2.6 一颗现代处理器,每秒大概可以执行多少条简单的MOV指令,有哪些主要的影响因素 1.2.7 请分析 MaxCompute 产品与分布式技术的关系、当前大数据计算平台类产品的市场现状和发展趋势 1.2.8 对大数据平台中的...
  • 动软.Net代码生成器

    2010-11-26 10:03:29
    动软.Net代码生成器Codematic是一款为C#数据库程序员设计的自动代码生成器,Codematic生成的代码基于面向对象的思想和三层架构设计...所以,了这个功能,对项目发布非常的方便,并且支持自己定义哪些发布哪些不发布。
  • CruiseYoung提供的带详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 SQL Server 2008宝典 共2部分:此为第002部分 基本信息 作者: 刘智勇 刘径舟 丛书名: 宝典丛书 出版社:...
  • CruiseYoung提供的带详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 SQL Server 2008宝典 共2部分:此为第001部分 基本信息 作者: 刘智勇 刘径舟 丛书名: 宝典丛书 出版社:...
  • iPhone开发秘籍(第2版)--源代码

    热门讨论 2012-12-11 13:51:22
    6.3 秘诀:查询视图 164 6.4 管理子视图 166 6.4.1 添加子视图 166 6.4.2 重新排序和删除子视图 166 6.4.3 视图回调 166 6.5 秘诀:标记和检索视图 167 6.6 秘诀:命名视图 168 6.7 视图的几何特征 172 ...
  • iPhone开发秘籍(第2版)--详细书签版

    热门讨论 2012-12-11 13:42:25
    6.3 秘诀:查询视图 164 6.4 管理子视图 166 6.4.1 添加子视图 166 6.4.2 重新排序和删除子视图 166 6.4.3 视图回调 166 6.5 秘诀:标记和检索视图 167 6.6 秘诀:命名视图 168 6.7 视图的几何特征 172 ...
  • 了解表视图的组成、表视图类的构成、表视图的分类,对表视图有了一个整体上的认识。接下来掌握了如何实现简单表视图和分节表视图,以及表视图中索引、搜索栏、分组的使用。然后学习了如何对表视图单元格进行删除、...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 128
精华内容 51
关键字:

查询有哪些视图方式