Optimize mysql query to use index on a Bitwise where clause

后端 未结 3 1371
梦如初夏
梦如初夏 2021-02-10 10:52

I have a query which looks like:

select count(*) from m1
WHERE  (m1.`resource` & 1472 );

Although I have index on resource it doesn\'t use

相关标签:
3条回答
  • 2021-02-10 11:10

    I do not believe MySQL can be made to use indexes for bitwise operations.

    There's some discussion of this in the MySQL Performance forum: http://forums.mysql.com/read.php?24,35318 ("Are index scans possible with bitwise comparison?") where a MySQL employee suggests a solution based on having a table with one row per (thing,set-bit) pair and doing a bunch of joins. I'd guess that how well this works will depend a lot on your particular application.

    According to http://dev.mysql.com/tech-resources/articles/mysql-set-datatype.html indexes aren't any use for doing the same sort of operations on SET values (which are implemented with integers and bitwise operations). I'd have thought that if there were any clever index optimization for bitwise operations it would already have been applied to SETs.

    0 讨论(0)
  • 2021-02-10 11:15

    MySQL doesn't use indexes if it believes it has to perform calculations on each row in the table.

    The only way to optimize these queries is to remove the calculation from the resource column. How you do that depends on what you want to achieve.

    eg - This does not use index

    where indexedCol*2 =6;

    But this does -

    where indexedCol =6/2;

    Not sure if you can achieve that in your bitwise & operation though.

    0 讨论(0)
  • 2021-02-10 11:15

    On Sql server, it does use index on bitwise operation. I am trying to reproduce the performance on MySql but cannot.... MySql is a great idea but if they do not consider fundammental performance on bitwise operation for example, this is a big disappointment indeed!

    0 讨论(0)
提交回复
热议问题