mysql 拾遗提高(函数、事务、索引)

目录

1、tips

2、事务(transaction)

3、索引(index)

4、数据库的导出和备份

5、函数

6、防SQL注入

7、使用Explain分析SQL语句

8、视图(view)

1、tips

1)、数据库不区分大小写;

2)、插入新数据时忽略重复数据,可在INSERT后加关键字IGNORE即可

3)、通过UNION操作符来连接两个以上的SELECT语句结果组合到一个结果到同一个集合中;

格式:

select... from... where...
union distinct
select...from...where...

其中distinct是可选的,表示会删除重复项,是默认值;也可使用all来保留所有的数据;

4)、拼音排序

如果汉字使用的是GBK编码,则可直接对某一项进行排序;如果使用的UTF-8,还需要进行转码,

例:select * from tablename order by convert(titlename using gbk);

5)、在group by...后边加with rollup可使数据在分组的基础上再进行聚合函数操作;

例:select name as 名字,sum(times) as 次数 from tablename group by name with rollup;可在对名字分组基础上再求次数的和,最后还有一个总和;

分组后相同项此次的统计不需要使用此关键词,使用count(*)即可;

例:select name as 名字 count(*) from tablename group by name;

6)、正则表达式

mysql也可以使用正则表达式来作为过虑条件

例:select * from tablename where name REGEXP ‘^s‘;  (查询以s开头的名字)

7)字符串的截取

select left(string,length)           从左边开始截取string的前length个字符,left可换用right来从右边开始截取;

select substring(string,index)      从左开始截取string从index位开始到结束的字符串(包括index位,且从1开始计数),如果index为负数则从右向左的截取;

select substring_index(string,reg,index)     使用同上,reg表示的匹配原则;

select CONCAT(string1,string2,...)连接字符串,但如果其中有任意一个为null,则最后结果为null;

8)条件语句

if(bool,value1,value2)    当bool为true时使用value1,否则value2; 例:select if(2=1,‘对‘,‘错‘) as status; 结果为‘错’;

ifnull(value1,value2)      如果value1为null则使用value2;

nullif(value1,value2)      如果value1和value2相同时结果为null,否则结果为value1;

coalesce(tablecolumn1,tablecolumn2,...,‘name‘)

意为如果tablecolumn1为null则使用tablecolumn2,依次顺推,‘name‘为一个固定的默认值;

select
    case [columnName]
    when condition1 then result1
    when condition2 then result2
    ...
    end
    as ‘别名‘
    from tablename;

9)、对于NULL值的处理

NULL值不能通过=或!=来比较获得结果,查找值为null的需要使用IS NULL,反之使用IS NOT NULL;<=>符号用于比较的两个值都为NULL时返回true;

10)临时表

主要用于保存一些临时数据,临时表在当前连接可见,一旦断开mysql连接则会自动销毁;创建临时表只需要在CREATE后加一个TEMPRARY字段,其他语法与创建表格是一样的;

11)SHOW CREATE TABLE tablename      查看表的创建语句;

12)表格的完整复制

CREATE TABLE newtable LIKE oldtable;    #复制表的结构,也可以使用CREATE TABLE newtable SELECT *FROM oldtable WHERE 1=2;
INSERT INTO newtable SELECT *FROM oldtable;

13)自增值序列重排:

原理:先删除此列再新建自增列(但是在处理过程中如果有新增数据,可能会使表数据变乱)

ALTER TABLE tablename DROP id;
ALTER TABLE tablename ADD id INT UNSIGNED NOT NULL AUTO_INCREMENT FIRST,ADD PRIMARTY KEY (id);

设置自增序号开始值:

ALTER TABLE tablename  AUTO_INCREMENT = 50; 此命令用于已经建好的表

或者可以在新建表的同时设置,在create table t(...)engine =innodb auto_increment=50 charset=utf8;

2、事务(transaction)

>事务主要用于处理操作量大,复杂度高的数据;只有使用了lnnodb数据库引擎的数据库才支持事务;

>事务是用来管理insert,update,delete等修改数据库的语句的,必须满足四个条件:

原子性:一个事务中所有操作要么全部完成,要么全部不完成;

一致性:在事务开始前和结束后,数据库的完整性没有被破坏;

隔离性:数据库允许多个并发事务同时进行;

持久性;事务处理结束后,对数据库的修改就是永久的;

格式:

begin;
expression;
commit;#确认并提交执行

事务控制语句:

    begin/start transaction   显示的开启一个事务;
    commit/commit work        提交事务;
    rollback/rollback work    回滚事务,会结束事务,并撤销正在进行的所有未提交的修改;
    savepoint identifier      创建一个保存点identifier,一个事务中可以有多个保存点;
    release savepoint identifier    删除一个保存点;
    rollback to identifier    回滚到一个保存点;
    set transaction           设置事务隔离级别,值有read uncommitted,read committed,repeatable read,serializable
    set autocommit = 0        禁止自动提交,如果为1则自动提交;

3、索引(index)

>索引可以很大的提高mysql检索速度;索引也是一张表,保存了主键与索引字段,并指向实体表的记录;会占用磁盘空间,会降低表的更新速度;

>索引分单列索引和组合索引,一个表可以有多个单列索引;组合索引即一个索引包含表中的多个列;只对那些将应用在查询条件(一般where后)的列创建索引;

>显示一个表的索引信息:SHOW INDEX FROM tablename; \G              最后的\G是可选的,用于格式化输出信息;

>查询索引使用情况:SHOW STATUS LIKE "handler_read%";结果中的handler_read_rnd_next值越高说明效率越低;(为什么越查越大。。。)

>创建索引:

    1)CREATE INDEX indexName ON mytable(username(length)); 如果是char,varchar类型length可小于实际长度,blob或text必须指定length。用UNIQUE INDEX来创建唯一索引(可以为空);
    2)创建表时创建;CREATE TABLE mytable(ID INT NOT NULL,username CHAR(16) NOT NULL, INDEX [indexName] (username(length)));如果唯一,则使用UNIQUE替换INDEX;
    3)ALTER TABLE tablename ADD INDEX indexName(columnName); 添加普通索引;
    4)ALTER TABLE tablename ADD UNIQUE [indexName] (username(length)); 添加唯一索引,可为NULL;
    5)ALTER TABLE tablename ADD PRIMARTY KEY (columnName);    添加主键;唯一且不为空;添加为主键前需要先确认它不为空:ALTER TABLE tablename MODIFY columnName NOT NULL;
    6)ALTER TABLE tablename ADD FULLETXT indexName (columnName);    指定索引为FULLTEXT,用于全文索引;

>删除索引     DROP INDEX [indexname] ON mytable;

ALTER TABLE tablename DROP PRIMARTY KEY;      删除主键;删除索引时需要知道索引名;

>如果like的查询条件以%开始,或者where条件没使用=号或条件给的数据类型与字段类型不一致时,不会使用索引;

>注意:

1)为维度度的列创建索引(列的重复值越少维度越高);

2)为where,on,group by,order by中的条件创建索引;

3)对较小数据列使用索引;

4)为较长字符串使用前缀索引(即限制索引表中值的长度,只取前一部分);

5)使用组合索引可以减少文件索引大小,速度会优于多个单列索引;

6)只为操作频繁的列创建索引;

4、数据库的导出和备份

1)数据导出到文件

SELECT ... INTO OUTFILE ‘fileAddressAndName‘ #以下两句都是用于设置输出格式的,可选;
    FIELDS TERMINATED BY ‘,‘ OPTIONALLY ENCLOSED BY ‘"‘
    LINES TERMINATED BY ‘\n‘;

导出文件存在于服务器主机,且文件名不能是一个已经存在的文件

2)从文件导入到数据库(为导出的逆操作)

LOAD DATA LOCAL INFILE ‘filename‘ INTO TABLE tablename #默认文件结构和表结构顺序一致,如果不一致需要使用tablename(columnName1,...)的方式来指定文件列与仓库中列相对应;
FIELDS TERMINATED BY ‘:‘
LINES TERMINATED BY ‘\n‘;

或者也可以使用mysqlimport语句来导入;

3)数据库备份:mysqldump -u root -p --no-create-info --table=/foldername filename

备份连接的所有数据库:mysqldump -u root -p --all-database > dumpname.txt 其中 --all-database也可为指定仓库名,来备份指定仓库;

将远程主机数据备份到本地:mysqldump -h remoteHost.com -P port -u root -p databaseName > dumpname.txt;

4)恢复备份:mysql -u root -p databaseName < dumpname.txt

5、函数

1>常用函数:

DATE_ADD(columnName,INTERVAL time type)    向日期列添加指定的时间间隔,time为数字,type为单位,可为MICROSECOND,SECOND,MINUTE,HOUR,DAY,WEEK,MONTH,QUARTER,YEAR,SECOND_MICROSECOND,MINUTE_MICROSECOND,MINUTE_SECOND,HOUR_MICROSECOND,HOUR_SECOND,HOUR_MINUTE,DAY_MICROSECOND,DAY_SECOND,DAY_MINUTE,DAY_HOURE,YEAR_MONTH;
DATE_SUB(columnName,INTERVAL time type)    向日期列减去指定的时间间隔;
DATEDIFF(date1,date2)                      返回两个日期之间的天数;
DATE_FORMAT(columnName,format)             用于定义显示日期/时间的格式,format内容为%a,%b,...等多种不同格式,具体待查;
NOW()                    返回当前的日期和时间;
CURDATE()                返回当前日期;
CURTIME()                返回当前时间;
DATE(columnName)         返回日期/时间表达式的日期部分;
EXIRACT(type FROM columnName)              返回日期/时间表达式的指定部分,type可用所有时间type

2>获取服务器数据:

select version()     服务器版本信息;
select database()    当前数据库名;
select user()        当前用户名;
show status          服务器状态;
show variables       服务器配置变量;

6、防SQL注入

SQL注入,即通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,以欺骗服务器执行恶意SQL命令;

1)永远不要信任用户输入,对用户输入进行校验,或使用正则表达式,限制长度,对单引号和双"-"号进行转换等;

2)永远不要使用动态拼装sql,可以使用参数化的sql或直接使用存储过程进行数据查询存取;

3)永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的连接数据库;

4)不要把机密信息直接存放,加密或者hash掉密码和敏感信息;

5)应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装;

6)可采用辅助软件或网站平台来检测是否有SQL注入,如软件有jsky;

7、使用Explain分析SQL语句

使用方法即在正常的SQL语句前加上 EXPLAIN 关键字,会将这条SQL语句的分析结果展示出来(sql语句在执行前都会由分析器进行分析,以判断语句的可行性的)

结果分析:

select_type        查询类型,有简单查询、联合查询、子查询等;
table              使用的数据表格;
type               连接使用的类型,结果从优到差:system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>all;const表示一次就得到结果,all表示全表扫描了;好的语句要优化到rang,ref级别;
possible_keys      显示能使用哪个索引在该表中找到结果,如果为空,则没有相关索引;
key                执行此语句实际使用到的索引;
key_len            最长索引宽度,越短越好;
ref                显示哪个字段或常数与key一起被使用;
rows               表示遍历了多少条数据;
extra              执行状态说明;

8、视图(view)

视图是一个虚拟表,内容是由其他表的数据组成的;视图只能查看不能修改;使用视图可以隐藏一些数据,也可以简化用户操作;

创建视图语法:

CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED|MERGE|TEMPTABLE}]
VIEW [db_name]view_name [(column_list)]
AS select_statement [WITH [CASCADED|LOCAL] CHECK OPTION]

示例:

CREATE VIEW query_view(id,name,class) AS SELECT B.u_id,B.u_name,A.class_name
    FROM t_class AS A INNER JOIN t_name AS B ON A.u_id=b.u_id;  #创建视图
DROP VIEW IF EXISTS query_view;     删除视图
SELECT * FROM query_view        使用一个视图查询数据
DESCRIBE query_view              查看视图结构
SHOW TABLE STATUS LIKE ‘query_view‘;显示视图状态;

原文地址:https://www.cnblogs.com/aland-1415/p/9278949.html

时间: 2024-11-07 03:45:05

mysql 拾遗提高(函数、事务、索引)的相关文章

Mysql视图触发器函数事务

1. 视图 100个SQL: 88: v1 select .. from v1 select asd from v1 某个查询语句设置别名,日后方便使用 - 创建 create view 视图名称 as SQL PS: 虚拟 - 修改 alter view 视图名称 as SQL - 删除 drop view 视图名称; 2. 触发器 当对某张表做:增删改操作时,可以使用触发器自定义关联行为 insert into tb (....) -- delimiter // -- create trig

mysql基础教程(四)-----事务、视图、存储过程和函数、流程控制

事务 概念 事务由单独单元的一个或多个SQL语句组成,在这 个单元中,每个MySQL语句是相互依赖的.而整个单独单 元作为一个不可分割的整体,如果单元中某条SQL语句一 旦执行失败或产生错误,整个单元将会回滚.所有受到影 响的数据将返回到事物开始以前的状态:如果单元中的所 有SQL语句均执行成功,则事物被顺利执行. 存储引擎 概念 在mysql中的数据用各种不同的技术存储 在文件(或内存)中. 查看 通过 show engines: 来查看mysql支持的存储引擎. 常见引擎 在mysql中用的

mysql 如何提高批量导入的速度

mysql 如何提高批量导入的速度 最近一个项目测试,有几个mysql数据库的表数据记录达到了几十万条,在搭建测试环境 导入 测试数据时,十分慢.在网上搜索了一下,有下面一些方法可以加快mysql数据库导入数据的速度:0. 最快的当然是直接 copy 数据库表的数据文件(版本和平台最好要相同或相似):1. 设置 innodb_flush_log_at_trx_commit = 0 ,相对于 innodb_flush_log_at_trx_commit = 1 可以十分明显的提升导入速度:2. 使

转MySQL详解--索引

写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页面大小为4K,并存储100条记录.如果没有索引,查询将对整个表进行扫描,最坏的情况下,如果所有数据页都不在内存,需要读取10^4个页面,如果这10^4个页面在磁盘上随机分布,需要进行10^4次I/O,假设磁盘每次I/O时间为10ms(忽略数据传输时间),则总共需要100s(但实际上要好很多很多).如果对之建立B-Tree索引,则只需要进行log100(

MySQL之锁、事务、优化、OLAP、OLTP

一 锁的分类及特性 数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则.对于任何一种数据库来说都需要有相应的锁定机制,所以MySQL自然也不能例外.MySQL数据库由于其自身架构的特点,存在多种数据存储引擎,每种存储引擎所针对的应用场景特点都不太一样,为了满足各自特定应用场景的需求,每种存储引擎的锁定机制都是为各自所面对的特定场景而优化设计,所以各存储引擎的锁定机制也有较大区别.MySQL各存储引擎使用了三种类型(级别)的锁定机制:表级锁

MySQL &#183; 引擎特性 &#183; InnoDB 事务系统

MySQL · 引擎特性 · InnoDB 事务系统 前言 关系型数据库的事务机制因其有原子性,一致性等优秀特性深受开发者喜爱,类似的思想已经被应用到很多其他系统上,例如文件系统等.本文主要介绍InnoDB事务子系统,主要包括,事务的启动,事务的提交,事务的回滚,多版本控制,垃圾清理,回滚段以及相应的参数和监控方法.代码主要基于RDS 5.6,部分特性已经开源到AliSQL.事务系统是InnoDB最核心的中控系统,涉及的代码比较多,主要集中在trx目录,read目录以及row目录中的一部分,包括

MySQL数据库引擎、事务隔离级别、锁

MySQL数据库引擎.事务隔离级别.锁 数据库引擎InnoDB和MyISAM有什么区别 大体区别为: MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行效率比InnoDB类型更快,但是不支持事务,而InnoDB提供事务支持以及外键等高级数据库功能. 具体实现的区别: InnoDB不支持FULLTEXT类型的索引 InnoDB中不保存表的具体行数,也就是说,执行查询SQL时,InnoDB要扫描一遍整个表来计算有多少行,而MyISAM只要简单的

关于数据库“事务”“索引”“实例”的含义

在学习数据库的时候经常听见"事务""索引""实例"等术语,那么他们具体是什么意思呢? 事务 事务:是指一个完整的操作过程.在这个过程中任何一个环节出现"意外",那么这个操作过程将会被回滚.事务经常被银行中的数据库使用. 例如:用户A向用户B转账100块,这时需要使用事务.首先,系统会从用户A的账户中扣除100块,然后在用户B的账户中增加100块.如果整过操作都成功,那么最终事务完成,转账成功.如果,某一步出现"意外&

php MySQL使用rand函数随机取记录(转)

php MySQL使用rand函数随机取记录 如何在mysql中使用随机数, 如何写一个语句能一下更新几百条MYSQL数据! 需要测试MYSQL数据库,里面有一个上万条数据的数据库,如何写一个PHP文件一下每次更新几百条信息,我都是写一个循环一次更新一条信息,这样我知道用WHILE写就可以了,要是一次更新好比100条数据改如何写呢! 正确答案是:UPDATE cdb_posts SET views = rand(); 顺便给你找了点关于mysql rand函数的实例,如下: 那就在insert