在网上可以查到有两种方式查询表的索引

show index from tablename
SELECT * FROM mysql.innodb_index_stats a WHERE a.database_name = '数据库名' and a.table_name like '%表名%';

第一种是可行的,问题是在于并不是用SELECT语句,所以就不能和其他的表数据一起查询,譬如说 查询表结构的时候连同索引一起查询。

(第二种来自于网络,实际上语句本身就有错误和低效的like,我们先只看逻辑) 仅看第二种也是不可行的,因为除了ROOT用户以外的用户无法访问innodb_index_stats表,所以是不行的。 在网上翻了很多页面都没有找到合适的解决方案,于是我把所有独立数据库用户身份可以查看的表全部翻看一遍之后发现。STATICS表中是存有索引数据的。

查询方式如下:

SELECT * FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = basename AND TABLE_NAME = tablename

将索引信息和表结构信息一起查看的查询:

SELECT * FROM INFORMATION_SCHEMA.COLUMNS LEFT JOIN INFORMATION_SCHEMA.STATISTICS ON COLUMNS.COLUMN_NAME=STATISTICS.COLUMN_NAME AND COLUMNS.TABLE_NAME = STATISTICS.TABLE_NAME AND  STATISTICS.TABLE_SCHEMA = '{$basename}' AND STATISTICS.TABLE_NAME = '{$tablename}' WHERE COLUMNS.TABLE_SCHEMA = '{$basename}' AND COLUMNS.TABLE_NAME = '{$tablename}' 

这里一定要注意使用表内筛选 先将STATISTICS表中的数据过滤一遍,再进行合并,两张表都要以basename,tablename进行过滤。否则会有很大概率得到循环嵌套的大量结果!

  1. From:

mysql分别用数字INT和中文varchar做索引查询效率上差多少

性能相当

mysql中区别性能的是采用哪种索引方式,而不是索引的数据类型。

MySQL的btree索引和hash索引的区别

  1. hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,
  2. btree(B-Tree)索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,
  3. 综上,hash 索引的查询效率要远高于 btree(B-Tree) 索引。 虽然 hash 索引效率高,但是 hash 索引本身由于其特殊性也带来了很多限制和弊端,主要有以下这些。

- 阅读剩余部分 -

在一个大型的复杂应用中,我们通常会将不同模块的数据存储到各自的表中 例如在APPsite框架中我们默认了4张用户表 分别存储了 user_account 账户表 user_info 详情表 user_pocket 钱包表 user_group 分组表

这样我们在读写数据的时候可以做到表级别的隔离,防止一些api 或是 内外部方法导致的数据泄露问题,提高安全性和事务方法的紧密度。 当然也有一定的减轻单张表结构过于臃肿的作用。

这里的表拆分,要基于业务划分去做,譬如说详情、分组、钱包在用户的鉴权、登录包括收发消息等行为时都不需要,那么我们就可以将这些部分的数据转移到新的表中。保持account表的高效性。

于此对应的是我们在进行后台的丰富数据查询时就需要合并表进行查询,今天特意整理一下使用JOIN进行多表联合查询的注意点。

首先是最简单的范例

# JOIN查询 双表
SELECT * FROM user_account 
LEFT JOIN user_info ON user_account.userid = user_info.userid

在多表查询时,我们会遇到某个表 对应项目为空时的情况, 这时根据JOIN方式就会有不同的结果。其中INNER 方式就会取交集合并结果,而LEFT方式左表会完整展示,右表不满足条件的数据会被剔除为空。

- 阅读剩余部分 -

最近有将AppSite框架进行公开发布(开源)的想法。 不过开源也就意味着更多的一份责任,如果是普通的个人系统还好,我们的系统商业化在很多中大型项目上,安全也是一个隐忧。

暂且先梳理一下

AppSite PHP全栈框架

Appsite的宗旨是用于快速开发网络\云应用\物联网

全栈支持引擎 Full stack Supporting Engine 介于CMS与Framework之间

AppSite 核心特色是极简的语义化编程

如果一个框架、一个语言、甚至一个程序他的可读性不好甚至很差,那么他就是我眼中的垃圾。 我们可以回想一下,高级语言的意义到底是什么? AppSite追求的就是当我们书写/维护我们的程序时,可以像读一篇文章一样,顺畅的知道别人写了什么,自己写过什么。 先不要跟我说什么设计模式、优雅还是什么安全的,首先,我们应该能阅读我们的代码,因为看明白代码之后,其他的都不耽误。

$validate = USER::mobileValidate('15000000000','123456');
if( $validate->isOk() ){
    print( 'validated' );
}else{
    print( $validate->status );
    print( $validate->message );
}

AppSite 主要思想是面向数据编程

从某个侧面来看计算机信息技术本身就是对于数据的各种处理,而AppSite就是这样的思想,我们的核心引擎着重解决的是提供一个可以自适应处理各种不同结构数据的一套程序开发套件。 基于这些高度自适应的基础功能,我们可以方便的创建各种方法或对象、进而快速实现不同的业务逻辑的新增或调整。

例如,我们对于向数据库添加数据的时候,通用的使用的是:

$DB->add( $data, $table );      // 数据库实例化操作方法
USER::add( $data );                 // 组件静态方法

这里相当于我们告诉程序 “我有这些数据,你添加一下。” 程序则通过设定好的规范自动去完成数据整理以及后续操作。

- 阅读剩余部分 -

Common Access System Design

最近在优化自己写的APPsite框架,其中一直以来没有妥善解决的权限模块可能是后面拓展出去的比较大的障碍。所以着手重写这个模块。 在现有的框架中ACCESS模块分为两大部分: 系统权限、单位权限两个。

系统权限主要用于验证系统功能是否可以执行。 主要支持了Token作用域验证功能,可以设置有效期、作用域、以及可执行次数。 ACCESS和密码验证不同,并不解决加密解密问题,只是负责一个权限的授予、验证、撤销的功能。

# 例1 手机改密码的流程:  作用域为 resetPassword
用户.发起请求 -> 
权限系统.开始流程 -> 
用户.提交验证 -> 
权限系统.验证(通过/拒绝)并授权(设置有效期) -> 
使用权限(一段时间有效 或 一次性有效)

单位权限类似于虚拟物品的所有权。支持以用户为单位的权限授权。 目前仅支持一种状态即 拥有( 可以访问、读取 ) 而写、删的权限仍然只归属于系统。

# 例2 虚拟商品包年授权:  
用户.发起购买 -> ... -> 支付验证成功 ->
权限系统.添加授权(设置有效期) ->
用户.拥有权限
----
客户端.查询授权 ->
权限系统.验证(通过|拒绝)并返回内容|错误 -> 
客户端.接收反馈 ->
用户.使用权限(获取内容等)

- 阅读剩余部分 -

在网上查看很多的帖子都是在 hypedown模块中注释掉对 \n 的解析 这样的做法是不行的,因为这样文章中的换行就会失效,所有的文字就堆到一起了。

查看了服务端的源代码并没有太好的解决方案,官方论坛所谓给出的已解决的开发板,我换了一下也并没有解决,这里先给一个临时解决方案。

在主题的footer中加入一行js代码即可

document.querySelectorAll(".post").forEach(function(post){ post.innerHTML = post.innerHTML.replace(RegExp(/<br><br>/g), '') });

主要就是检测同时出现两行的换行 就将它剔除掉 当然不完美,不过也没必要花太多时间在这个部分,大体上解决了问题~

最近自己鼓捣物联网的玩法,买了一个树莓派,打算通过自己的服务器来做数据通讯。 由于一直以来的框架都是php写的,所以仍然沿用php。 在使用soket的时候为了简化开发成本,扩展未来的可能性这里选用了workman来进行。

总体来说 Typecho做到了简洁实用,有些部分虽然有些简单或是有些不足,但是自行修改是十分便捷的,这非常适合用来维持一个单纯的博客系统。

因为近期实在是感受到了记忆力下滑、接触面过广的时候对于笔记、知识点记忆搜索的需求很强烈,不得不重新拾起曾经一度丢弃的个人博客。 区别在于以前更多的是设计作品展示、图片展示。现在更重要的是做技术博客。

在很久之前我一直以来习惯的就是使用WordPress来搭建博客和网站,曾经在做设计师的时候折腾过蛮多次WordPress来制作个人网站、在线教育网站,包括给别人搭建电子商务网站。 2017年 基本主义在线商城: 基本主义

但是由于一些原因、我不打算再尝试WordPress这个较重、同时风险也比较高的CMS 其中最主要原因还是因为折腾成本太高、想要去自定义的时候需要很了解这个框架的设计、想要深度定制的难度很大、修改别人的主题、模板的时候由于代码的结构化很差、所以想要做修改的时间成本异常的高。

(也正是因为2017年痛的领悟,所以自行开发了AppSite全栈框架) 现在自己再去写一个博客又感觉挺浪费时间的。

简书、lofter这类自由度不够、cnblogs、CSDN等技术博客又太过不能入眼, 所以决定还是找一个极简的cms来做,这时候正好发现了Typecho。

- 阅读剩余部分 -

WEBHOOK是一种系统通知的形式,在达到特定条件时系统自动触发网络请求。 可以理解为服务端系统中的跨设备回调函数。

手头有很多个项目在同时运作维护,核心的框架也不断在升级和修复。 刚开始的时候项目很少,基本上就是通过sublimetext的SFTP直接手动上传,现在随着需要维护的项目增多,每次做更新和上传的时候都会出现版本间的不同步,部署的繁琐,不能做到增量更新,更新效率比较差。

现在研究一下使用webhook来做到自动部署。目前的代码库托管在gitee码云。

注!我这里的主要需求主要是核心库分布式的增量更新,所以主要是包更新,一次更新通知多个服务器进行同步,不是一个整站代码的更新,当然整站上传也可以采用这样的方式,有的时候使用ftp来处理网站更新也不坏。

- 阅读剩余部分 -

Android WebView不能加载ajax?加载ajax无效?

!苹果或高版本的安卓webview可能会有跨域被拦截的问题,需要在服务端允许跨域。 另外高版本的webview注意使用HTTPS协议的请求,普通http将会被拦截 php示例代码:

header('content-type:application:json;charset=utf8');
header('Access-Control-Allow-Origin:*'); // 被允许的访问来源
header('Access-Control-Allow-Methods:POST');
header('Access-Control-Allow-Headers:x-requested-with,content-type');

1、WebView的支持js是否打开; webSettings.setJavaScriptEnabled(true);

2、webView拓展的api是否打开: webSettings.setDomStorageEnabled(true);

- 阅读剩余部分 -