MySQL索引优化

MySQL索引优化,mysql,indexing,Mysql,Indexing,我有下表-‘元素’ CREATE TABLE `element` ( `eid` bigint(22) NOT NULL AUTO_INCREMENT, `tag_name` varchar(45) COLLATE utf8_bin DEFAULT NULL, `text` text COLLATE utf8_bin, `depth` tinyint(2) DEFAULT NULL, `classes` tinytext COLLATE utf8_bin, `webarc

我有下表-‘元素’

CREATE TABLE `element` (
  `eid` bigint(22) NOT NULL AUTO_INCREMENT,
  `tag_name` varchar(45) COLLATE utf8_bin DEFAULT NULL,
  `text` text COLLATE utf8_bin,
  `depth` tinyint(2) DEFAULT NULL,
  `classes` tinytext COLLATE utf8_bin,
  `webarchiver_uniqueid` int(11) DEFAULT NULL,
  `created` datetime DEFAULT NULL,
  `updated` datetime DEFAULT NULL,
  `rowstatus` char(1) COLLATE utf8_bin DEFAULT 'A',
  PRIMARY KEY (`eid`)
) ENGINE=InnoDB AUTO_INCREMENT=12090 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
上面给出了列详细信息和当前索引详细信息。此表上几乎90%的查询如下:

select * from element 
    where tag_name = 'XXX'  
    and text = 'YYYY'  
    and depth = 20  
    and classes = 'ZZZZZ'  
    and rowstatus = 'A'
在这个表上创建索引的最佳方法是什么?该表大约有60k行。

将类从TINYTEXT更改为VARCHAR255或更合理的大小,然后

INDEX(tag_name, depth, classes)
以任意顺序排列列。我省略了rowstatus,因为它闻起来像一个可能会更改的列。无论如何,标志不会给索引增加太多内容

不能在索引中包含文本或BLOB列。而且不值得做“前缀”索引

由于主键是唯一键,所以删除索引eid_是唯一的


为所有字符字段选择二进制/utf8\u bin有什么原因吗?

在标记名称、文本、深度、类上创建一个复合索引怎么样。。。如果您不满意,则全额退款。我们可以仅通过执行show create table元素来丢失图片。。所以你有8500行。好啊很难阅读,我肯定可以点击它。但我的意思是破译。或者留下它给我们短信谢谢。如果我对elementtag\u名称、文本、类、行状态使用CreateIndexElement\u搜索;我得到了这个错误:在键规范中使用的BLOB/TEXT列“TEXT”没有键长度。这个问题的解决方案是什么?我想知道你是否真的需要一个文本文本不是一个很好的列名选择,因为它是一个保留字。你会后悔的,我认为“utf8\u bin”来自我的工具。我也可以删除rowstatus,它不是一个表演的障碍。文本的解决方案是什么,因为有时它可以包含5000多个字符的大文本,尽管平均长度大约为100。对于列文本,听起来是正确的。对于索引,我在复合索引中提到的3列可能会做得足够好。utf8_bin似乎来自名为Binary的列。问题是A和A被视为不同的字符。然而,对于utf8_general_ci,它们将被视为平等的。对于文本来说,这通常是正确的。性能略有提高。我还可以做其他设计更改来提高性能吗?现在运行需要多长时间?输出中有多少行?请将修改后的SHOW CREATE表添加到您的问题中。