mysql常识整理


fulltext全文索引(mysql新功能)
unique唯一性索引
primary主键索引

唯一索引和主键的区别

唯一索引的字段可为空,主键不可为空


mysql 中UNIQUE KEY 到底是约束还是索引
1.两者关系
unique索引包含了unique约束,因为unique约束是通过unique索引实现的. 
为了实现唯一约束,数据库会强制定义一个唯一索引在数据库上面
2.两者相同点
保证了往表中插入重复列值的操作都会失败。
两者的区别
3.区别在于建立和删除上.索引是使用 create/drop index 创建和删除的而约束是使用 alter table tb add constraint 建立, 使用 drop constraint 删除  




mysql查看索引使用情况
EXPLAIN SELECT * FROM fchelp.demo WHERE NAME='葡萄'
其中rows表示索引行,值越小表示索引效率越高
type=const表示通过索引一次就找到了;
key=primary的话,表示使用了主键;
key=null表示没用到索引
type=all,表示为全表扫描;
type=ref,因为这时认为是多个匹配行,在联合查询中,一般为REF。
key_len MYSQL使用的索引长度
keys MYSQL使用的索引,简单且重要
possible_keys 提示使用哪个索引会在该表中找到行,不太重要
rows 显示MYSQL执行查询的行数,简单且重要,数值越大越不好,说明没有用好索引


索引失效的问题
有组合索引key idx_id_name(name,id)
如果where语句中只有id的过滤,则会先全表扫描然后查找id,索引失效,如果只对name过滤,索引生效


range方式分区
CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT NOT NULL,
    store_id INT NOT NULL
)


partition BY RANGE (store_id) (
    partition p0 VALUES LESS THAN (6),
    partition p1 VALUES LESS THAN (11),
    partition p2 VALUES LESS THAN (16),
    partition p3 VALUES LESS THAN (21)
);
ODPS分布式海量数据处理平台(类似的平台还有hadoop,spark)


select * from A ,B;会造成笛卡尔乘积
mysql为什么尽量不做连表查询
1,mysql连表查询是比较慢的,相比先查出一个表的记录,然后再查另外一个表。
2,单表查询的数据方便做缓存。
3,连表查询是会锁多表,单表查询只锁单表。
4,如果以后需要分库分表,连表的sql语句就需要改了


数据库建立索引顺序(先等值,后范围--索引存储形式为二叉树,如果先范围的话当遍历到某个临界节点的时候往下的叶子节点都要遍历然后将这些叶子节点
存放到内存中作为等值筛选的过滤内容,需要再次过滤的行数就比较多,效率会偏慢)


新版mysql幻读状况 对于要分页的sql,order by后面的字段一定要唯一,由于mysql5.7的是多线程的,不能确保每次取前10行和后10行数据中的第10个数据和11个数据一定是10在

前面,11在后面,这种不稳定性可能会造成做分页的时候翻到第一页看不到某条数据,翻到第二页的时候也看不到,这就是刚好看第一页的时候跑到第二页了,看
第二页的时候跑到第一页了


新版数据库对于计数count都是查找到一条数据就返回1,只是用做计数,当编写成count(*)的时候不会进行全表扫描,难免有些旧版本的数据库不是这样,所以

一般写成count(1)


机房容灾-多数派原则,至少一个master节点两个slave节点,如果只有一个slave,只要master向slave发送命令,没有接收到响应就会判断为失败,这样错误率

会过高,多数派原则就是只要超过半数的slave节点成功了,都会视为成功,当master宕机后2个slave会重新数据合并并选出新的master节点


分表操作

扫描二维码关注公众号,回复: 1761256 查看本文章

虽然做分表会解决大数据量的查询问题,但是表的数量也增加了,对应的每张物理表的执行计划也增加了,当要drop表的时候,因为需要遍历链表结构中的每个

执行计划,会出现速度慢甚至死机的可能.




mysql常用函数

SELECT * FROM `help_template`
SELECT NOW() FROM DUAL;
SELECT CURDATE() FROM DUAL;
SELECT CURTIME() FROM DUAL;
SELECT UNIX_TIMESTAMP() FROM DUAL;
SELECT SYSDATE() FROM DUAL LIMIT 0,1;
SHOW INDEX FROM help_template
SHOW TABLE STATUS  FROM fchelp
SELECT IFNULL(logo_url,"nothing") FROM help_template;
SELECT IF(id>2,'this','thus') FROM help_template;
SELECT 
  CASE
    WHEN logo_url = 'https://os.alipayobjects.com/rmsportal/vverjbfEuBHQPNO.png' 
    THEN 'nothing' 
    ELSE logo_url 
  END 
FROM
  help_template ;
  
SELECT CAST(NOW() AS SIGNED INTEGER),CURDATE()+0;
SELECT DATE_FORMAT(NOW(),'%W,%D %M %Y %r');
SELECT CONCAT(DATE_FORMAT(NOW(),'%Y-%m-%d'),'时间',(SELECT UNIX_TIMESTAMP() FROM DUAL));
SELECT TRIM(' bar ');
SELECT REPLACE('www.mysql.com', 'w', 'Ww');
SELECT REPEAT('MySQL', 3);
SELECT REVERSE('abc');
SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;
SELECT SECOND('10:05:03');
SELECT MINUTE('1998-02-03 10:05:03');
SELECT HOUR('10:05:03');
SELECT YEAR('1998-02-03');
SELECT MONTH('1998-02-03');
SELECT WEEK('2009-02-20');
SELECT QUARTER('98-04-01');


SELECT * FROM help_template WHERE tnt_inst_id REGEXP '^[[:alpha:]]{8}|glTest$';


mysql格式化代码ctrl+f12  执行代码f9


ibatis二元判定
二元判定有两个判定参数,一是属性名,而是判定值,如 
<isGreaterThan prepend="AND" property="age"  compareValue="18"> 
age=#age#
</isGreaterThan> 


ibatis class别名

typeAlias通过一个简单的别名来表示一个冗长的类型,这样可以降低复杂度。
<typeAlias alias="SisUserRole" type="com.gzduanxun.sysmgr.model.SisUserRole"/>


ibatis复杂类型属性映射
<resultMap id=”get-product-result” class=”com.ibatis.example.Product”> 
<result property=”id” column=”PRD_ID”/> 
<result property=”description” column=”PRD_DESCRIPTION”/> 
<result property=”category” column=”PRD_CAT_ID” select=”getCategory”/> 
</resultMap> 
<resultMap id=”get-category-result” class=”com.ibatis.example.Category”> 
<result property=”id” column=”CAT_ID”/> 
<result property=”description” column=”CAT_DESCRIPTION”/> 
</resultMap> 
<statement id=”getProduct” parameterClass=”int” resultMap=”get-product-result”> 
select * from PRODUCT where PRD_ID = #value# 
</statement> 
<statement id=”getCategory” parameterClass=”int” resultMap=”get-category-result”> 
select * from CATEGORY where CAT_ID = #value# 
</statement> 


ibatis cacheModel缓存模型
cacheModel 的属性值等于指定的 cacheModel 元素的 name 属性值。属性 cacheModel 定
义查询 mapped statement 的缓存。每一个查询 mapped statement 可以使用不同或相同的
cacheModel。
<cacheModel id="product-cache" imlementation="LRU"> 
<flushInterval hours="24"/> 
<flushOnExecute statement="insertProduct"/> 
<flushOnExecute statement="updateProduct"/> 
<flushOnExecute statement="deleteProduct"/> 
<property name=”size” value=”1000” /> 
</cacheModel> 
<statement id=”getProductList” parameterClass=”int” cacheModel=”product-cache”> 
select * from PRODUCT where PRD_CAT_ID = #value# 
</statement> 
上面例子中, “getProductList”的缓存使用 WEAK 引用类型,每 24 小时刷新一次,或
当更新的操作(insertProduct,updateProduct,deleteProduct)发生时刷新。


ibatis内联参数和外联参数
自动参数映射  
<insert id="insertUser" parameterClass="User">  
  insert into user(username,password,department)  values(#username#,#password#,#department#)  
</insert>  
内敛参数映射  
<insert id="insertUser2" parameterClass="User">  
  insert into user(username,password,department)  values(#username:VARCHAR#,#password:VARCHAR#,#department:VARCHAR#)  
</insert>  
外联参数映射  
<parameterMap  id="userMap" class="User">  
        <parameter property="username" jdbcType="VARCHAR"/>  
        <parameter property="password" jdbcType="VARCHAR"/>  
        <parameter property="department" jdbcType="VARCHAR"/>  
</parameterMap>  
<insert id="insertUser3" parameterMap="userMap">  
INSERT INTO USER  
(   
USERNAME, PASSWORD, DEPARTMENT  
)VALUES(  
?,?,?   
)  
</insert>


ibatis存储过程调用
<parameterMap id="swapParameters" class="map" > 
<parameter property="email1" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/> 
<parameter property="email2" jdbcType="VARCHAR" javaType="java.lang.String" mode="INOUT"/> 
</parameterMap> 
<procedure id="swapEmailAddresses" parameterMap="swapParameters" > 
{call swap_email_address (?, ?)} 
</procedure> 


ibatis自动生成主键
<insert id="insertProduct-MS-SQL" parameterClass="com.domain.Product"> 
insert into PRODUCT (PRD_DESCRIPTION) 
values (#description#) 
<selectKey resultClass="int" keyProperty="id" > 
SELECT @@IDENTITY AS ID 
</selectKey> 
</insert> 




ibatis foreach支持 
<select id="getListParams" resultMap="myResultMap">
select
name,risk
from
DC_BG_RISK_SCAN
where
id_card_no=#{idCardNo}
and
name in        <foreach collection="names" item="name" index="index" open="(" close=")" separator=",">
#{name,jdbcType=VARCHAR}        </foreach>

limit 1    </select>

其中name是java中注入的集合中的对象

SELECT * FROM table LIMIT 5,10;  // 检索记录行 6-15


ibatis创建sequence的格式规范
建议1: create sequence 建议放在一行里,其它的minvalue、maxvalue、start with、increment by、cache、cycle、noorder选项建议各自单独一行,如下所示:
create sequence tradecore00.seq_trade_base_00
minvalue 1
maxvalue 999999
start with 1
increment by 1
cache 200
cycle;
其中:
(1) minvalue用于指定sequence的最小值。
(2) maxvalue用于指定sequence的最大值。
(3) start with用于指定sequence产生的第一个值。
(4) increment by用于指定步长。
(5) cache 用于让sequence预生成一些序列号cache在内存中。
(6) cycle 用于指定sequence到达最大值时从最小值又开始循环。


 规范1: 删除sequence时必须带上属主的名字。
例如:
drop sequence tradecore00.seq_trade_base_00;


菜单
select max(substr(sys_connect_by_path(deptname,','),2)) from dept connect by prior deptno=mgrno;    
--------------------------------------------------------------------------------   
总公司,浙江分公司,杭州分公司  


行转列

create table demo(id int,name varchar(20),nums int);  ---- 创建表
insert into demo values(1, '苹果', 1000);
insert into demo values(2, '苹果', 2000);
insert into demo values(3, '苹果', 4000);
insert into demo values(4, '橘子', 5000);
insert into demo values(5, '橘子', 3000);
insert into demo values(6, '葡萄', 3500);
insert into demo values(7, '芒果', 4200);
insert into demo values(8, '芒果', 5500);


select * from (select name, nums from demo) pivot (sum(nums) for name in ('苹果' 苹果, '橘子', '葡萄', '芒果'));
或者采用多表查询的方法
select * 
from 
(
select sum(nums) 苹果 
from demo 
where name='苹果'
),
(
select sum(nums) 橘子 
from demo 
where name='橘子'
),
(
select sum(nums) 葡萄 
from demo 
where name='葡萄'
),
(
select sum(nums) 芒果 
from demo 
where name='芒果'
);


列转行--将季度进行转换

create table Fruit(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int);  
insert into Fruit values(1,'苹果',1000,2000,3300,5000);  
insert into Fruit values(2,'橘子',3000,3000,3200,1500);  
insert into Fruit values(3,'香蕉',2500,3500,2200,2500);  
insert into Fruit values(4,'葡萄',1500,2500,1200,3500); 


select id, name, jidu, xiaoshou --非聚合
from Fruit unpivot
(
xiaoshou for jidu in (q1, q2, q3, q4)
)


wm_concat(列名),该函数可以把列值以","号分隔起来,并显示成一行
create table test(id number,name varchar2(20));  
  
insert into test values(1,'a');  
insert into test values(1,'b');  
insert into test values(1,'c');  
insert into test values(2,'d');  
insert into test values(2,'e');  
输出结果是:'a,b,c,d,e'


对于上千条的大数据量插入
,与DBA协商使用SQLLDR工具导入
创建临时表,用于回滚与验证
create table mobile.tmp_activity_resource_1111 tablespace zhifb_data as select * from mobile.mobile_activity_resource where 1=0;
新建控制文件,命名为 conf.ctl
OPTIONS(BINDSIZE=67772160,READSIZE=67772160,ERRORS=-1,ROWS=10000)
load data
append 
into table mobile. tmp_activity_resource_1111  
fields terminated by ',' TRAILING NULLCOLS 
(  resourcedata,
  activityid,
  userid,
  status,
  GMT_CREATE   date "YYYY-MM-DD HH24:MI:SS"  "sysdate",
  GMT_MODIFIED  date "YYYY-MM-DD HH24:MI:SS"  "sysdate",
  MEMO    ,
  id  "mobile.seq_mobile_activity_resource.nextval"
)
使用SQL LOADER导入
sqlldr userid=mobile/PASSWORD control=conf.ctl log=load.log bad=bad.log data=out.txt 
(out.txt文件内容如附件: )
导入成功后,执行以下脚本
insert mobile.mobile_activity_resource(resourcedata, activityid, userid, status, GMT_CREATE, GMT_MODIFIED,MEMO,ID)  
select  resourcedata, activityid, userid, status, GMT_CREATE, GMT_MODIFIED,MEMO,ID 
from mobile. tmp_activity_resource_1111;
回滚
DELETE FROM MOBILE.mobile_activity_resource  WHERE ID IN SELECT ID FROM MOBILE. tmp_activity_resource_1111;











































猜你喜欢

转载自blog.csdn.net/weixin_38907570/article/details/79541626
今日推荐