《java代码示例》
摘要
一些示例说明
- sql 频次分析
- show GLOBAL STATUS like ‘com_______’
- 查看慢查询日志是否开启
- show VARIABLES like ‘slow_query_log’
- my.cnf 可以开启慢查询
- 开启慢查询:show_query_log=1
- 超过x秒记录日志:long_query_time=2
- profile
- 是否支持: select @@have_profiling
- 是否开启: select @@profiling
- 开启: set profiling = 1
- 单条sql每步耗时占比: show profile for query [query_id]
- 唯一索引 全文索引 普通索引
- 聚集索引 有一个
- 默认主键
- 其次唯一索引
- 否则隐藏rowid字段
- 二级索引 有多个
- 页子节点是聚集索引
- 二级索引检索先找到聚集索引,再通过聚集索引找到行数据(回表查询)
- b+树高度
- 2层可以承载n8+(n+1)6=61024 n约等于1170 117016=18736条数据
- 3层可以承载1171*16=21939856条数据
- 索引失效
- 需要符合最左前缀索引
- or 其中一列没有索引将失效
- 使用索引建议
- 禁止在更新十分频繁、区分度不高的属性上建立索引。
- 逻辑删除规则
- 需要逻辑删除的情况
- 防止数据误删除,不能找回数据;
- 这些数据还具有一定的商业价值,比如用户的注册信息;
- 虽然这些数据可以删除,但是这些数据还有关联数据,这些关联数据不能删除。
- 逻辑删除带来的问题
- 数据库表的数据冗余,导致查询缓慢;
- 写sql进行数据处理时需要排除那些已经逻辑删除的数据,这就会导致sql复杂,容易出错,特别是涉及多表查询时;
进行逻辑删除时,还需要考虑与之相关的数据怎么处理;
还有,如果数据表的某个字段要求唯一,并强制约束,比如用户表中的登录用户名字段,设计为逻辑删除的话,一旦有新的同用户名记录就无法插入。但如果不将该字段设置为唯一性约束的,那么在每次插入数据的时候,都需先进行一次查询,看看有无未(逻辑)删除的同名记录存在,低效率是一回事,而且在高并发的系统中,很难保证其正确性。
- 简单了解前缀索引的概念,目前感觉无实际的应用意义
- 一段文字过长时可以截取前几位字符串作为索引
- 可以先通过查询sql从区分度最高与截取长度之间找平衡
- 覆盖索引效率最高
- 因为查询字段就是索引列,无需徽标查询
线程暂停的实现 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37这里提供一个public方法setSuspend来设置暂停标识。如果为true时当前线程获取control对象的锁,并执行wait()方法。此时线程会一直处于阻塞状态,直到control对象
调用notify或者notifyAll方法。
public class MyThread extends Thread {
private String control = "";//只是任意的实例化一个对象而已
private boolean suspend = false;//线程暂停标识
@Override
public void run() {
while (true) {
synchronized (control) {
if (suspend) {
try {
control.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//doSomething
}
}
public void setSuspend(boolean suspend) {
if (!suspend) {
synchronized (control) {
control.notifyAll();
}
}
this.suspend = suspend;
}
}
- 因为查询字段就是索引列,无需徽标查询
- 需要逻辑删除的情况